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中定义的此变量?”无法访问它