任何人都可以解释这里发生了什么:
function, function, false
输出 - 如果你在IE8中运行 - 是:
function, function, true
其他浏览器会给出:
bob
- 正如您所料!
据我所知,在IE8中收集范围的工作方式不同。
在其他浏览器中,最后一行的this.bob
和this
是相同的引用,因为bob
是窗口 - 即全局范围 - 而bob
是指全局变量。
在IE8中 - 我相信 - function bob
是本地参考,由function
定义。
即使是这种情况,肯定两个引用都引用相同的bob == this.bob
对象,因此{{1}}仍应返回true?
有没有人对IE8有足够的深入了解来解释这种行为?
答案 0 :(得分:0)
所以,回答我自己的问题 - 基于提供的link @Teemu:
正如我在问题中所解释的那样,this
指的是窗口,它也是全局范围,因此this.bob
创建了一个全局bob
变量 - 到目前为止,非常好!
在大多数浏览器中,this.bob
和bob
在语义上是相同的 - 它们表示对同一函数实例的相同全局引用。没有本地bob
。
IE8有两个特定的怪癖,围绕命名函数表达式,在这行代码中使用:
this.bob = function bob() {};
第一个怪癖是函数的名称'泄漏'进入本地范围 - 成为一个新的局部变量。因此,下一行代码中的bob
不再表示全局bob
变量 - 它现在表示一个单独的本地bob
变量。
第二个怪癖是在IE8中,当您将命名函数表达式分配给上面的变量时,IE8 实际上创建了2个函数实例!,因此this.bob
没有等于本地bob
引用的实例!