在JavaScript中,是否可以指定在未定义局部变量时将使用的全局上下文?
示例:
(function foo() {
console.log(bar);
})();
它实际上会打印window.bar
。
我可以以某种方式改变全球背景吗?像这样:
var myGlobalContext = { bar: "foo" };
(function foo() {
console.log(bar);
}).applyWithGlobal(myGlobalContext);
应打印myGlobalContext.bar
。
或将this
作为全球背景附加?
我希望这个例子足够清楚。
答案 0 :(得分:2)
您可以使用.call()
并通过函数内的this.xyz
引用变量来执行此操作:
(function foo() {
console.log(this.bar);
}).call(myGlobalContext);
唯一的另一种方法是将函数调用包装在另一个范围内:
(function() {
var bar = '123';
(function() {
console.log(bar);
})();
})();
答案 1 :(得分:2)
您可以做的最接近的事情是使用with
语句屏蔽全局变量。
var myGlobalContext = {bar: "foo"};
with(myGlobalContext)
{
console.log(bar);
}
这与更改全局上下文不同,因为myGlobalContext
中找不到的其他全局变量仍然存在。
通常,with
语句为bad,但听起来您的用例可能是有意义的用例。
答案 2 :(得分:0)
您可以通过将命名空间传递给IIFE来执行此类操作:
var myNamespace = { bar: "foo" };
(function( ns ) {
console.log( ns.bar );
}( myNamespace ));