我是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.callFunction.prototype.applyFunction.prototype.bind(返回新函数)。在您的情况下,您可以这样使用call

innerFn.call(this);


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

关于javascript - 为什么这是这里的窗口Obj的引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26928455/

10-12 01:28