我是js的新手并且觉得我理解这个的概念,直到我遇到。
function TopLevelFn(){
var obj = {
empId : 232
};
console.log('TopLevelFn() empId :' + obj.empId);
innerFn();
function innerFn(){
//why this points to window object...
console.log('innerFn() empId :' + this.obj.empId);
}
}
var register = new TopLevelFn();
如果我清楚地理解了从TopLevelFn()中调用了innerFn(),那么调用obj和 this 应该引用TopLevelFn()?
答案 0 :(得分:0)
上下文取决于您如何调用该函数。您的案例在ECMAScript规范10.4.3 Entering Function Code中描述:
当控制进入执行时,执行以下步骤 函数对象F中包含的函数代码的上下文,一个调用者 提供了 thisArg ,并且调用者提供了 argumentsList :
- 如果功能代码是严格代码,请将ThisBinding设置为 thisArg 。
- 否则如果thisArg null 或 undefined ,请将ThisBinding设置为 全球对象。
醇>
由于您没有提供thisArg
,因此该功能在全球范围内执行。
现在您可能会问如何提供thisArg
价值? ECMAScript定义了三种显式指定执行上下文的方法:Function.prototype.call
,Function.prototype.apply
和Function.prototype.bind
(返回新函数)。在您的情况下,您可以使用call
,如下所示:
innerFn.call(this);
在这种情况下,innerFn
将在this
对象的上下文中调用。否则innerFn()
将具有全局上下文。