Javascript存储范围行为

时间:2014-10-18 10:46:11

标签: javascript scope bind

Name = 'window data';
document.Name = 'current document data';

(function(window, document) {
    var Name = 'local data';

    var myObj = {
        Name: 'object data',
        f: function() {
            alert(this.Name);
        }
    };

    myObj.newFun = function() {
        alert("Local scope " + Name + "\nObject Scope : " + this.Name);
    }

    function testFun() {
        alert("Window Scope : " + window.Name +
            "\nLocal Scope : " + Name +
            "\nObject Scope : " + this.Name +
            "\nCurrent document Scope : " + document.Name
        );
    }

    myObj.newFun();
    //testFun(); // Promts see "Object Scope : window data", but suppose to be "Object Scope : local data"
    // did not found the answer
    testFun.call(myObj);
    testFun.bind({
        Name: "name injected"
    })();

})(window, document);

我试图在自执行匿名块中调用testFun()时发现了一个奇怪的行为。我在代码中添加了一条评论,其中包含实际发生的情况以及我的预期。

任何人都可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

testFun的上下文为window,因此行为完全正常(调用testFun()将在window的上下文中运行它)。您在下面的行testFun.call(myObj)将产生所需的行为(call使用第一个参数作为上下文调用函数,或this)。

请记住,您正处于自执行匿名块(或立即函数)的闭包中,这与上下文不同。任何未绑定为对象方法的函数的上下文始终为window,无论它是否为闭包。然而,它是关闭的,无论函数声明在哪里,所以如果你要在你的函数结束时返回函数并将其分配给外部的变量,alert(Name)将显示local data而不是{{ 1}},因为testFun是在window data等于Name的闭包中声明的。

进一步澄清:

local data