这个关键字如何在函数调用链上起作用?

How does this keyword work on a function call chain?

我在 Kyle Simpson 的“你不知道的 JS 系列”中读到了 this 关键字。在书中,他对 this 关键字解释的概念之一是 Default Binding。 函数对象中使用的 this 关键字基于函数的调用站点。如果函数调用发生在全局范围内,则被调用函数中使用的 this 关键字表示全局范围。 考虑这个例子,

var a=100;

function fun(){
    var a=10;
    console.log(this.a);
}

fun();   // outputs 100

现在我试图更好地理解并尝试了这个例子,

var a=100;

function f1(){
   console.log(this.a);
}

function f2(){
   var a=10;
    f1();
}

f2();         // outputs 100 and not 10. Why?

由于函数 f1 的调用发生在函数 f2 的上下文中,我认为函数 f1 中的 this.a 可能输出为 10。但它输出为 100 . 这是怎么发生的?

f1 将记录全局 this.a which = 100 因为 a 的其他赋值不在 f1 中。由于您仍在 f2() 函数内部调用 f1(),因此 f1 仍会读取全局 a,即 100。如果您有 f2() {a=10}; 并调用 f2();你会 return 10. 不要在你的 f2 函数中调用 f1(),但仍然记得包含 console.log( this.a );在这两个功能中。

var a=100; 是在全局范围内定义的变量,任何函数都可以访问。 var a=10; 是在 f2 函数范围内定义的局部变量,仅在此函数内部可用。

this.a 将全局变量引用为局部变量 af2 范围内定义的函数在 f1

中不可用

无法将f2var a绑定到f1的thisf2var a只是一个局部变量f2 的范围,它与 this 关键字无关,因为它只是一个普通的局部变量。

你不懂JS中提到的隐式绑定,是最常见的使用this关键字的方式。这本书的意思是 this 关键字仅取决于使用点符号引用的对象,在您的示例中,因为 f1 被调用时没有附加任何对象,所以唯一可以应用的规则它是默认绑定。