这两个都是指同一个变量?

时间:2014-09-19 10:39:45

标签: javascript

我的情况很混乱......

(function sayStuff(){
    this.word = "hello2";
    (function (){
        console.log(this.word);
    }())
}())


var myObject = {
    word: "bar",
    func: function() {
        (function() {
            console.log(this.word);
        }());
    }
};
myObject.func();

输出

hello2 hello2

这是怎么回事?如何关闭' func' myObject实际上看到sayStuff()中引用的变量?我认为IIFE旨在保护国际范围内的内部人员?

2 个答案:

答案 0 :(得分:5)

在这两种情况下,this都是window,全局默认上下文取代了您在调用内部函数表达式时未提供的上下文。

如果您想保留上下文,请不要在内部使用IIFE或在上下文中调用它们:

(function sayStuff(){
    this.word = "hello2"; // still this is window, use var if you don't want that
        (function() {
            console.log(this.word); // window.word
        }).call(this); // well, this is window...
}())


var myObject = {
    word: "bar",
    func: function() {
        (function() {
            console.log(this.word); // myObject.word
        }).call(this);
    }
};
myObject.func();

答案 1 :(得分:2)

IIFE仅隐藏本地范围的变量(即使用var关键字创建的变量)。

所有触摸this.word的函数都在全局上下文中调用(即不是作为对象的方法,不是new关键字而不是apply,{{1} }或call),因此bind在每种情况下均为this。您正在处理全局变量。

如果你想要一个私人变量,你会做更多这样的事情:

window
相关问题