这个关键字如何在函数调用链上起作用?
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
将全局变量引用为局部变量 a
在 f2
范围内定义的函数在 f1
中不可用
无法将f2
的var a
绑定到f1的this
,f2
的var a
只是一个局部变量f2
的范围,它与 this
关键字无关,因为它只是一个普通的局部变量。
你不懂JS中提到的隐式绑定,是最常见的使用this
关键字的方式。这本书的意思是 this
关键字仅取决于使用点符号引用的对象,在您的示例中,因为 f1
被调用时没有附加任何对象,所以唯一可以应用的规则它是默认绑定。
我在 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
将全局变量引用为局部变量 a
在 f2
范围内定义的函数在 f1
无法将f2
的var a
绑定到f1的this
,f2
的var a
只是一个局部变量f2
的范围,它与 this
关键字无关,因为它只是一个普通的局部变量。
你不懂JS中提到的隐式绑定,是最常见的使用this
关键字的方式。这本书的意思是 this
关键字仅取决于使用点符号引用的对象,在您的示例中,因为 f1
被调用时没有附加任何对象,所以唯一可以应用的规则它是默认绑定。