为什么`this`指代父函数的作用域

时间:2019-04-24 11:11:52

标签: javascript

我确实读过this关键字既可以引用全局范围,也可以引用它所引用的对象,也可以引用事件绑定到的对象,但是以下行为是无法理解的。

function outer() {
  var inner = 4;

  function innerFunc() {
    var inner = 5;
    console.log('inner called with ' + this.inner);
  }
  return innerFunc;
}
var obj = outer();
obj();

为什么此日志4而不是5。AFAIK this应该引用其所引用的功能,并且应该可以通过closure使用。

3 个答案:

答案 0 :(得分:2)

TL; DR-this不能像您认为的那样工作。

了解更多hereherehere


函数的this(也称为上下文)是在调用时间而不是在函数定义时确定的。众所周知,this是动态绑定的,闭包中的变量是动态绑定的

var obj = outer();
obj();

使用outer(在Node.js中为this = window)调用global,因为您未处于严格模式(否则为this = undefined)。 outer不使用this,因此不会对其产生太大影响。

outer然后返回一个函数(innerFunc),然后将其分配给obj。然后,您再次用obj呼叫this = window(因为您没有用.bind().call().apply()指定其他任何内容)。

然后登录this.inner,它等效于window.inner的{​​{1}},除非您碰巧有一个名为undefined的全局变量,并且有一些值。


然后inner的值由调用方确定。

如果您像这样调用this

obj

无论功能如何定义,您都将在控制台中看到42。

减轻这种情况并保持对obj.call({inner: 42}); // first argument to fn.call() is the context 的控制的一种方法是使用fn.bind()arrow function

答案 1 :(得分:1)

您的代码段返回的是undefined,而不是4。其原因是因为window通过调用innerFunc来调用obj()。因此,this是指window,因为这就是所谓的innerFunc(而window.innerundefined)。您可以通过在代码顶部添加一个变量inner = 3(这将使window.inner = 3)可见,这样您的函数将记录3

inner = 3; // ie: window.inner = 3
function outer() {
  var inner = 4;

  function innerFunc() {
    var inner = 5;
    console.log('inner called with ' + this.inner); // this is window
  }
  return innerFunc;
}
var obj = outer();
obj();

答案 2 :(得分:0)

在此示例中,您使用的是功能而不是对象。此外,您使用变量而不是this关键字来分配值。我认为您正在考虑的概念是local scoping

例如,

function parent(){
var n = 5
    function child(){
         var n = 4 //n is 4 here
    }
//n is 5 here
}