2015-08-18 20 views
1

即時通訊新的JavaScript,並想知道會是怎樣的代碼的輸出:JavaScript的輸出例如從代碼

var myObject = { 
    foo: "bar", 
    func: function() { 
    var self = this; 
    console.log("outer func: this.foo = " + this.foo); 
    console.log("outer func: self.foo = " + self.foo); 
    (function() { 
     console.log("inner func: this.foo = " + this.foo); 
     console.log("inner func: self.foo = " + self.foo); 
    }()); 
    } 
}; 

不知道FOO是如何工作的呢。

+5

也許你可以自己試試這個?你不需要社區來嘗試這些代碼,你可以自己做。 –

回答

5

Javascript中的每個函數調用都會根據函數的調用方式重置this的值(有關控制this的五種方式,請參閱this answer)。

所以,當你使用IIFE結構(function() { ... })()這僅僅是一個普通的函數調用的this值復位到無論是window對象或undefined如果嚴格模式下運行。

因此,如果您未在strict模式下運行,則內部函數中的this.foo引用將嘗試訪問window.foo,這可能是undefined

而且,果然,當我在a jsFiddle that is not in strict mode運行這個,居然叫myObject.func()控制檯顯示:

outer func: this.foo = bar 
outer func: self.foo = bar 
inner func: this.foo = undefined 
inner func: self.foo = bar 

另外一個console.log()聲明證實,在內部FUNC this === window,當然,window.fooundefined


如果run your code in strict mode,然後調用myObject.func()會因爲內部FUNC,this === undefined產生這個錯誤Uncaught TypeError: Cannot read property 'foo' of undefined