在JavaScript中指定全局上下文
在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
(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
窗口
之前检查是否存在barmyGlobalContext.bar
如果存在,否则window.bar
。