在JavaScript中指定全局上下文

时间:2013-12-02 21:41:57

标签: javascript global-variables

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

示例:

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

它实际上会打印window.bar

我可以以某种方式改变全球背景吗?像这样:

var myGlobalContext = { bar: "foo" };

(function foo() {
    console.log(bar);
}).applyWithGlobal(myGlobalContext);

应打印myGlobalContext.bar

或将this作为全球背景附加?

我希望这个例子足够清楚。

3 个答案:

答案 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 ));