Javascript 关于正规函数和箭头函数的问题

Javascript 关于正规函数和箭头函数的问题,javascript,Javascript,从未完全理解箭头函数和正常函数上下文中的词汇范围 this.thisGlobalVariable=200; 函数normalFunction(){ this.this变量=100; } 函数normalFunctionTwo(){ console.log(this.this变量);//100 console.log(this.globalVariable);//未定义 } 让匿名箭头函数=()=>{ console.log(this.thisVariable);//未定义 console.lo

从未完全理解箭头函数和正常函数上下文中的词汇范围

this.thisGlobalVariable=200;
函数normalFunction(){
this.this变量=100;
}
函数normalFunctionTwo(){
console.log(this.this变量);//100
console.log(this.globalVariable);//未定义
}
让匿名箭头函数=()=>{
console.log(this.thisVariable);//未定义
console.log(this.thisGlobalVariable);//200
}
normalFunctionTwo();

匿名函数()对于正常函数,此
的值在调用函数时确定。您在没有任何上下文的情况下调用函数,因此
设置为窗口对象(在非严格模式下)。由于所有函数都与同一窗口对象交互,因此它们可以看到彼此的手工工作(尽管示例代码中存在一些错误,使其无法正常工作)

还有其他调用函数的方法,它们将导致此函数的不同值。例如,假设我将一个函数粘贴到一个对象中,并通过引用该对象来调用它:

this.val='from window';
函数doStuff(){
console.log(this.val);
}
常数myObj={
val:'来自对象',
日志:doStuff
}

console.log(doStuff===myObj.log)/对于正常函数,此
的值在调用函数时确定。您在没有任何上下文的情况下调用函数,因此
设置为窗口对象(在非严格模式下)。由于所有函数都与同一窗口对象交互,因此它们可以看到彼此的手工工作(尽管示例代码中存在一些错误,使其无法正常工作)

还有其他调用函数的方法,它们将导致此函数的不同值。例如,假设我将一个函数粘贴到一个对象中,并通过引用该对象来调用它:

this.val='from window';
函数doStuff(){
console.log(this.val);
}
常数myObj={
val:'来自对象',
日志:doStuff
}
console.log(doStuff===myObj.log)/“正常函数”通过调用它们的方式确定它们的上下文,因此:

 context.method();
调用
方法
,其中
this
指向
上下文
。现在你知道了

 normalFunctionTwo();
它在没有任何上下文的情况下调用函数,然后上下文默认为
窗口
对象。所以
这个
内部
normalFunctionTwo
(以及它的外部)指向
窗口
。在这种情况下,箭头函数没有区别。

“正常函数”通过调用它们的方式确定它们的上下文,因此:

 context.method();
调用
方法
,其中
this
指向
上下文
。现在你知道了

 normalFunctionTwo();

它在没有任何上下文的情况下调用函数,然后上下文默认为
窗口
对象。所以
这个
内部
normalFunctionTwo
(以及它的外部)指向
窗口
。在这种情况下,箭头函数没有区别。

您误解了如何确定此
:引用自

在大多数情况下,该值由函数的调用方式决定。它不能在执行期间通过赋值进行设置,每次调用函数时可能会有所不同。ES5引入了bind方法来设置函数this的值,而不管它如何调用,ES2015引入了arrow函数,这些函数不提供自己的this绑定(它保留封闭词法上下文的this值)

的值不是由
函数创建的,您不能直接分配给它。相反,
将在执行前解决(请参阅)。这就是为什么存在
Function.apply
Function.call
Function.bind
的原因,它们可以用来明确地设置

“正常”函数声明和箭头函数声明的区别在于,在第二个
中,该
自动绑定到封闭的词法上下文



顺便说一句,在您的代码片段中,
始终引用全局范围。

您对如何确定此
存在误解:引用自

在大多数情况下,该值由函数的调用方式决定。它不能在执行期间通过赋值进行设置,每次调用函数时可能会有所不同。ES5引入了bind方法来设置函数this的值,而不管它如何调用,ES2015引入了arrow函数,这些函数不提供自己的this绑定(它保留封闭词法上下文的this值)

的值不是由
函数创建的,您不能直接分配给它。相反,
将在执行前解决(请参阅)。这就是为什么存在
Function.apply
Function.call
Function.bind
的原因,它们可以用来明确地设置

“正常”函数声明和箭头函数声明的区别在于,在第二个
中,该
自动绑定到封闭的词法上下文



顺便说一句,在您的代码段中,
始终引用全局范围。

“NormalFunction2如何访问此。normalFunction中定义的thisVariable?”它无法访问它。你费心运行你发布的代码了吗?按蓝色按钮<代码>控制台.log(this.this变量)在两次执行时都输出
未定义的
。您是否运行过
normalFunction()
?可能重复“normalFunctionTwo如何访问此。normalFunction中定义的此变量?”无法访问它