IE8 javascript与命名函数表达式的范围奇怪

时间:2017-02-09 12:49:56

标签: javascript internet-explorer-8

任何人都可以解释这里发生了什么:

function, function, false

输出 - 如果你在IE8中运行 - 是:

function, function, true

其他浏览器会给出:

bob - 正如您所料!

据我所知,在IE8中收集范围的工作方式不同。

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

在IE8中 - 我相信 - function bob是本地参考,由function定义。

即使是这种情况,肯定两个引用都引用相同的bob == this.bob对象,因此{{1}}仍应返回true?

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

this.bob = function bob() {};

第一个怪癖是函数的名称'泄漏'进入本地范围 - 成为一个新的局部变量。因此,下一行代码中的bob不再表示全局bob变量 - 它现在表示一个单独的本地bob变量。

第二个怪癖是在IE8中,当您将命名函数表达式分配给上面的变量时,IE8 实际上创建了2个函数实例!,因此this.bob 没有等于本地bob引用的实例!