gpt4 book ai didi

javascript - 如何在 JS 中独立于上下文(浏览器、节点)分配读取根变量?

转载 作者:行者123 更新时间:2023-12-02 17:14:31 25 4
gpt4 key购买 nike

我有一个函数,可以将对象分配给自定义命名空间,而不覆盖路径中的现有对象,有点像 mkdir -p ,例如:

assignObjectToNamespace(myObj, "com.stackoverflow.questions.root", window)

原型(prototype)是这样的:

assignObjectToNamespace(object, namespace, target)

因此您创建了 namespacetarget并分配 object到它。显然如果com.stackoverflow已存在于 target您不想覆盖它/初始化它。

此方法主要在浏览器上下文中使用,因此不要传递 window作为目标我想要 target是可选的,默认为根元素。

我在实现中的某个地方:

if(!target) return
var recursiveElement = target

然后recursiveElement将被分配给命名空间中的第二个对象,第三个,依此类推,直到没有更多的 .命名空间中的分隔元素。

如果我想将代码更改为

var recursive element = target || root

应该做什么root是吗?

我们不默认的原因rootwindow是让这个库更加通用,并避免将其绑定(bind)到浏览器上下文。我知道这不是什么大问题,但我不想只是更改代码来适应它,或者只是放弃并强制使用第三个参数,而是想知道是否存在我不知道的怪癖。

最佳答案

当不在浏览器上下文中时,根上下文通常称为全局,因此您可以使用它。

所以你可以这样做:

var context = typeof window === 'undefined' ? global:window;

或更一般地 - 不引用 globalwindow:

var customGlobalContext;
(function() { customGlobalContext = this; }).call(null);

后者之所以有效,是因为任何没有上下文执行的方法(简单地 f()f.call(null) )都将在全局上下文中执行,并且 this 将引用它。

更新

虽然第一种方法仍然不错,但第二种方法可能会在严格模式中遇到问题。

在 @Bergi 发表评论后,我阅读了 this有趣的文章,解释了 this 关键字的来龙去脉。

在它之后,我想说,为了获取全局上下文,请将此行放在文件的根目录中(因此不要包装在任何方法/函数中) >):

var customGlobalContext = this;

在这种情况下,this将引用全局上下文,无论你在哪里(nodejs/window/等)

关于javascript - 如何在 JS 中独立于上下文(浏览器、节点)分配读取根变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24549787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com