为什么这是Obj窗口的参考?

时间:2014-11-14 10:58:53

标签: javascript

我是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()?

1 个答案:

答案 0 :(得分:0)

上下文取决于您如何调用该函数。您的案例在ECMAScript规范10.4.3 Entering Function Code中描述:

  

当控制进入执行时,执行以下步骤   函数对象F中包含的函数代码的上下文,一个调用者   提供了 thisArg ,并且调用者提供了 argumentsList

     
      
  1. 如果功能代码是严格代码,请将ThisBinding设置为 thisArg
  2.   
  3. 否则如果thisArg null undefined ,请将ThisBinding设置为   全球对象。
  4.   

由于您没有提供thisArg,因此该功能在全球范围内执行。

现在您可能会问如何提供thisArg价值? ECMAScript定义了三种显式指定执行上下文的方法:Function.prototype.callFunction.prototype.applyFunction.prototype.bind(返回新函数)。在您的情况下,您可以使用call,如下所示:

innerFn.call(this);

在这种情况下,innerFn将在this对象的上下文中调用。否则innerFn()将具有全局上下文。