我是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的对象应该引用给TopLevelFn()吗?
最佳答案
上下文取决于您如何调用该函数。您的案例在ECMAScript规范10.4.3 Entering Function Code中进行了描述:
当控制进入执行时执行以下步骤
功能对象F(调用者)中包含的功能代码的上下文
提供thisArg,而调用方提供argumentsList:
如果功能代码是严格代码,则将ThisBinding设置为thisArg。
否则,如果thisArg为null或未定义,请将ThisBinding设置为
全局对象。
由于不提供thisArg
,因此该函数在全局上下文中执行。
现在您可能会问如何提供thisArg
值? ECMAScript定义了三种方法来显式指定执行上下文:Function.prototype.call
,Function.prototype.apply
和Function.prototype.bind
(返回新函数)。在您的情况下,您可以这样使用call
:
innerFn.call(this);
在这种情况下,将在
innerFn
对象的上下文中调用this
。否则,innerFn()
将具有全局上下文。关于javascript - 为什么这是这里的窗口Obj的引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26928455/