IE8 javascript 命名函数表达式的作用域异常

IE8 javascript scoping weirdness with named function expressions

谁能解释一下这是怎么回事:

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

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

输出——如果你在 IE8 中 运行 这个——是:

function, function, false

其他浏览器会给出:

function, function, true - 如您所料!

据我所知,IE8 中的作用域工作方式有所不同。

在其他浏览器中,最后一行的 bobthis.bob 是相同的引用,因为 this 是 window - 即全局范围 - bob 指的是一个全局变量。

不过在 IE8 中 - 我相信 - bob 是一个本地引用,由 function bob.

定义

即使是这种情况,两个引用肯定都指向同一个 function 对象,因此 bob == this.bob 应该仍然 return 是真的??

有没有人对 IE8 有足够深入的了解来解释这种行为?

所以,回答我自己的问题 - 基于 link @Teemu 提供的:

正如我在问题中解释的那样,this 指的是 window,它也是全局范围,因此 this.bob 创建了一个全局 bob 变量 -到目前为止,一切顺利!

然后在大多数浏览器中,this.bobbob 在语义上是相同的 - 它们表示对同一函数实例的相同全局引用。没有本地bob.

IE8 有两个特殊的怪癖,围绕命名函数表达式,如这行代码中所用:

this.bob = function bob() {};

第一个怪癖是函数名'leaks'进入了局部作用域——成为一个新的局部变量。因此,下一行代码中的 bob 不再表示全局 bob 变量 - 它现在表示一个单独的局部 bob 变量。

第二个怪癖是,在 IE8 中,当你像上面那样将一个命名函数表达式赋给一个变量时,IE8 实际上创建了 2 个函数实例!,所以 this.bob 是否等于本地bob!

引用的实例