又是关于闭包的疑问,比较高级的疑问的原文:
又是关于闭包的疑问,比较高级的疑问
在“又是关于闭包的疑问,比较高级的疑问”一贴中,没有一个结论能够让自己信服 ,于是晚上又仔细翻了ECMA.
如果有错误,也希望各位能指点一下
首先精简一下代码,其实这段代码和“又是关于闭包的疑问,比较高级的疑问”中的代码原理是一样的,但相比之下更短,更能说明问题
var outwrap = function(){
var fn = function(){
//结果是[object Window]
alert(this);
};
fn();
};
var o = new outwrap();
在11.2.3 Function calls(ecma规范P44页)
看到这里,也许会问,难道fn的类型是一个Reference,而且GetBase()的结果是activation object?不错, 就是这样:
10.1.4 Scope Chain and Identifier Resolution(ecma规范P38页)
也就是说在执行fn()之前, 会沿着scope chain查找fn这个变量, 结果在当前作用域就找到了fn变量,所以GetBase()的结果只能是activation object……, 于是fn中的this先被置为null,再被置为window