2017-02-09 36 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所提及的实例!