2017-02-09 39 views
0

誰能解釋什麼是怎麼回事:IE8的JavaScript作用域古怪與有名函數表達式

(function() { 
    this.bob = function bob() {}; 

    window.alert(typeof(bob) + ', ' + typeof(this.bob) + ', ' + (bob == this.bob)); 
})(); 

輸出 - 如果你在IE8上運行這一點 - 是:

其他瀏覽器會給:

function, function, true - 正如你所期望的!

就我所能在IE8中收集不同範圍的作品而言。

在其它的瀏覽器,bobthis.bob,在最後一行,是相同的參考,因爲this是窗口 - 即全球範圍內 - 和bob指全局變量。

儘管在IE8中 - 我相信 - bob是一個本地參考,如function bob所定義。

即使是這種情況,當然兩個參考文獻都是指相同的function對象,所以bob == this.bob仍然應該返回true?

有沒有人有足夠深入的IE8知識來解釋這種行爲?

+1

不,IE8也創建了一個全局'bob'。其他瀏覽器在函數中將'this.bob'和'bob'視爲相同的引用,因爲它應該是。 http://kangax.github.io/nfe/ – Teemu

+0

解釋它 - 謝謝@Teemu!張貼作爲答案,我會標記它是正確的 - 但我想你不需要聲譽..?! :-) –

+0

等等!有什麼[錯](https://jsfiddle.net/zg512xjf/)... – Teemu

回答

0

因此,要回答自己的問題 - 基於link @Teemu提供:

正如我在這個問題解釋說,this指窗口,這也是全球範圍內,所以this.bob創建一個全局bob變量 - 到目前爲止,太棒了!

在大多數瀏覽器中,this.bobbob在語義上是相同的 - 它們表示對同一個函數實例的全局引用。沒有本地bob

IE8有兩個特殊的怪癖雖然,各地有名函數表達式,在這行代碼中使用:

this.bob = function bob() {}; 

第一怪癖是函數「泄漏」入本地範圍的名字 - 成爲一個新的局部變量。因此,下一行代碼中的bob不再表示全局bob變量 - 它現在表示單獨的本地bob變量。

第二個怪癖是,在IE8中,當您將一個命名的函數表達式分配給上述變量時,IE8 實際上會創建2個函數實例!,所以this.bob確實不是等於本地bob所提及的實例!