0

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

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

原型将类似于:

assignObjectToNamespace(object, namespace, target)

因此,您创建namespaceontarget并将其分配object给它。显然,如果com.stackoverflow已经存在,target您不想覆盖它/初始化它。

此方法将主要用于浏览器上下文中,因此window我希望它不是作为目标传递的,而是target可选的,并且默认为根元素。

在实现中的某个地方,我有:

if(!target) return
var recursiveElement = target

然后recursiveElement将分配给命名空间中的第二个对象,第三个对象,依此类推,直到.命名空间中不再有单独的元素。

如果我想将代码更改为

var recursive element = target || root

应该root是什么?

我们不默认的原因rootwindow为了让这个库更通用一点,并避免将它绑定到浏览器上下文。我知道这不是什么大问题,但不是仅仅更改代码以适应它,或者只是放弃并强制第三个参数,我想知道那里是否有我不知道的怪癖。

4

1 回答 1

2

当不在浏览器上下文中时,通常会调用根上下文global,因此您可以使用它。

所以你可以这样做:

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

或更笼统地说-不引用globalor window

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

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

更新

虽然第一种方法仍然很好,但第二种方法可能会在strict mode.

在@Bergi 的评论之后,我阅读this了有趣的文章,其中解释了this关键字的进出。

在它之后,我会说,为了获取global上下文,在文件的根目录中有这一行(所以不包含在任何方法 / 中function):

var customGlobalContext = this;

在这种情况this下,无论您身在何处(nodejs/window/etc.),都将引用全局上下文

于 2014-07-03T09:25:54.003 回答