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 中的作用域工作方式有所不同。
在其他浏览器中,最后一行的 bob
和 this.bob
是相同的引用,因为 this
是 window - 即全局范围 - bob
指的是一个全局变量。
不过在 IE8 中 - 我相信 - bob
是一个本地引用,由 function bob
.
定义
即使是这种情况,两个引用肯定都指向同一个 function
对象,因此 bob == this.bob
应该仍然 return 是真的??
有没有人对 IE8 有足够深入的了解来解释这种行为?
所以,回答我自己的问题 - 基于 link @Teemu 提供的:
正如我在问题中解释的那样,this
指的是 window,它也是全局范围,因此 this.bob
创建了一个全局 bob
变量 -到目前为止,一切顺利!
然后在大多数浏览器中,this.bob
和 bob
在语义上是相同的 - 它们表示对同一函数实例的相同全局引用。没有本地bob
.
IE8 有两个特殊的怪癖,围绕命名函数表达式,如这行代码中所用:
this.bob = function bob() {};
第一个怪癖是函数名'leaks'进入了局部作用域——成为一个新的局部变量。因此,下一行代码中的 bob
不再表示全局 bob
变量 - 它现在表示一个单独的局部 bob
变量。
第二个怪癖是,在 IE8 中,当你像上面那样将一个命名函数表达式赋给一个变量时,IE8 实际上创建了 2 个函数实例!,所以 this.bob
不是否等于本地bob
!
引用的实例
谁能解释一下这是怎么回事:
(function () {
this.bob = function bob() {};
window.alert(typeof(bob) + ', ' + typeof(this.bob) + ', ' + (bob == this.bob));
})();
输出——如果你在 IE8 中 运行 这个——是:
function, function, false
其他浏览器会给出:
function, function, true
- 如您所料!
据我所知,IE8 中的作用域工作方式有所不同。
在其他浏览器中,最后一行的 bob
和 this.bob
是相同的引用,因为 this
是 window - 即全局范围 - bob
指的是一个全局变量。
不过在 IE8 中 - 我相信 - bob
是一个本地引用,由 function bob
.
即使是这种情况,两个引用肯定都指向同一个 function
对象,因此 bob == this.bob
应该仍然 return 是真的??
有没有人对 IE8 有足够深入的了解来解释这种行为?
所以,回答我自己的问题 - 基于 link @Teemu 提供的:
正如我在问题中解释的那样,this
指的是 window,它也是全局范围,因此 this.bob
创建了一个全局 bob
变量 -到目前为止,一切顺利!
然后在大多数浏览器中,this.bob
和 bob
在语义上是相同的 - 它们表示对同一函数实例的相同全局引用。没有本地bob
.
IE8 有两个特殊的怪癖,围绕命名函数表达式,如这行代码中所用:
this.bob = function bob() {};
第一个怪癖是函数名'leaks'进入了局部作用域——成为一个新的局部变量。因此,下一行代码中的 bob
不再表示全局 bob
变量 - 它现在表示一个单独的局部 bob
变量。
第二个怪癖是,在 IE8 中,当你像上面那样将一个命名函数表达式赋给一个变量时,IE8 实际上创建了 2 个函数实例!,所以 this.bob
不是否等于本地bob
!