在JavaScript中指定全局上下文

在JavaScript中指定全局上下文,javascript,global-variables,Javascript,Global Variables,在JavaScript中,如果未定义局部变量,是否可以指定将使用的全局上下文 例如: (function foo() { console.log(bar); })(); 它实际上会打印window.bar 我能改变全球环境吗?大概是这样的: var myGlobalContext = { bar: "foo" }; (function foo() { console.log(bar); }).applyWithGlobal(myGlobalContext); 它应该打印my

在JavaScript中,如果未定义局部变量,是否可以指定将使用的全局上下文

例如:

(function foo() {
    console.log(bar);
})();
它实际上会打印
window.bar

我能改变全球环境吗?大概是这样的:

var myGlobalContext = { bar: "foo" };

(function foo() {
    console.log(bar);
}).applyWithGlobal(myGlobalContext);
它应该打印
myGlobalContext.bar

或者将此附加为全局上下文

我希望示例足够清晰。

您可以通过函数中的
this.xyz
使用并引用变量来实现:

(function foo() {
    console.log(this.bar);
}).call(myGlobalContext);
唯一的其他方法是将函数调用包装到另一个作用域中:

(function() {
    var bar = '123';

    (function() {
        console.log(bar);
    })();
})();

可以通过将名称空间传递给IIFE来执行类似操作:

var myNamespace = { bar: "foo" };

(function( ns ) {
  console.log( ns.bar );
}( myNamespace ));

最接近的方法是使用
with
语句屏蔽全局变量

var myGlobalContext = {bar: "foo"};

with(myGlobalContext)
{
    console.log(bar);
}
这与更改全局上下文不同,因为在
myGlobalContext
中找不到的其他全局上下文仍将存在


一般来说,
with
语句是,但听起来您的用例可能是有意义的。

我知道-但是不使用
这个
关键字就可以访问
。@MartinMajer我也添加了一个例子。@MartinMajer为什么?这对任何阅读您的代码的人来说都是非常混乱的——未声明的变量应该始终被视为全局范围。如果您想使用不同于
this
的关键字,可以使用我的答案并将名称空间传递到IIFE中。代码将自动生成。我想将
{=writeMe}
编译成如下内容:
函数模板(context,writer){writer(context.writeMe);}
这很好,但也意味着一些额外的解析,因为我必须决定在哪里添加
上下文。
。因此,如果我可以使用
writeMe
而不是
上下文,那就太好了。writeMe
+1阅读这里的所有内容:另外:“一般”与“克罗克福德说”不同:)@David嗯,一般来说,克罗克福德是疯了,但是那篇文章用很好地解释了
的问题。如果定义了
window.bar
,会发生什么情况?@MartinMajer它会在
myGlobalContext
窗口
之前检查是否存在bar
myGlobalContext.bar
如果存在,否则
window.bar