“什么是”呢;这";在JavaScript中的箭头函数中
我有一个关于箭头函数中“this”指向什么的问题:“什么是”呢;这";在JavaScript中的箭头函数中,javascript,node.js,scope,this,arrow-functions,Javascript,Node.js,Scope,This,Arrow Functions,我有一个关于箭头函数中“this”指向什么的问题: //通过:node test\u this.js在nodejs中运行此文件 常量对象={ 范围:本,, func1:()=>{返回此}, func2:函数(){ 常数fn=()=>这个; 返回fn(); } } console.log(“0”,对象范围);//模块.出口 console.log(“1”,obj.func1());//模块.出口 log(“2”,obj.func2())//obj 常量newFunc2=obj.func2; log
//通过:node test\u this.js在nodejs中运行此文件
常量对象={
范围:本,,
func1:()=>{返回此},
func2:函数(){
常数fn=()=>这个;
返回fn();
}
}
console.log(“0”,对象范围);//模块.出口
console.log(“1”,obj.func1());//模块.出口
log(“2”,obj.func2())//obj
常量newFunc2=obj.func2;
log(“newFunc2”,newFunc2())//全球的
正如我所知,箭头函数没有自己的“this”。一旦arrow函数被声明,作用域就决定了“this”,并且它永远不会被更改。但是为什么
console.log(“2”,obj.func2())代码>输出obj
?为什么console.log(“newFunc2”,newFunc2())代码>打印不同的结果全局
?您的obj
声明的此
的词法值是模块。导出
。这是声明obj
变量时this
的值
因此,这就解释了为什么obj.scope
是module.exports
,因为这是在用代码声明和初始化对象时this
的值scope:this,
您似乎已经知道,当使用对象调用arrow函数声明时,如obj.func1()
中所示,它不会像this
那样执行obj
。相反,它使用了this
的词法版本(声明时的版本)。正如obj.scope
所示,this
的词法值是module.exports
。因此,console.log(“1”,obj.func1())
的结果是module.exports
(因为func1
定义为箭头函数)
然后,使用声明为普通函数的obj.func2()
,因此func2
内部的this
的值,当被称为obj.func2()
时,将是obj
。这就是类似obj.func2()
的方法函数调用在Javascript中的工作方式(只要函数是普通函数定义或方法定义,而不是箭头函数)
最后,当您这样做时:
const newFunc2 = obj.func2;
您只获得了对func2
方法的引用,而该方法本身就是一个引用。您只隔离了该方法,它与对象不再有任何关联。因此,当您这样调用它时:
console.log("newFunc2",newFunc2());
obj
引用的对象已完全消失,此
值将设置为与任何普通函数调用相同的值。如果运行严格模式,此
的值将设置为未定义
,如果未运行严格模式,则设置为全局
值
有关所有这些工作原理的回顾或未来的参考,请参阅:
.您的obj
声明的this
的词法值是module.exports
。这是声明obj
变量时this
的值
因此,这就解释了为什么obj.scope
是module.exports
,因为这是在用代码声明和初始化对象时this
的值scope:this,
您似乎已经知道,在obj.func1()
中使用对象调用箭头函数声明时,它不会像this
那样执行obj
。相反,它使用this
的词法版本(声明时的版本)。正如obj.scope
显示的那样,this
的词法值是module.exports
。因此,console.log(“1”,obj.func1())
的结果是module.exports
(因为func1
被定义为箭头函数)
然后,使用声明为普通函数的obj.func2()
,因此func2
内部的this
的值,当被称为obj.func2()
时,将是obj
。这就是类似obj.func2()
的方法函数调用在Javascript中的工作方式(只要函数是普通函数定义或方法定义,而不是箭头函数)
最后,当您这样做时:
const newFunc2 = obj.func2;
您只获得了对func2
方法的引用,而该方法本身就是一个引用。您只隔离了该方法,它与对象不再有任何关联。因此,当您这样调用它时:
console.log("newFunc2",newFunc2());
obj
引用的对象已完全消失,此
值将设置为与任何普通函数调用相同的值。如果运行严格模式,此
的值将设置为未定义
,如果未运行严格模式,则设置为全局
值
有关所有这些工作原理的回顾或未来的参考,请参阅:
,它在该范围内通过this
引用窗口对象。下面的示例演示了obj.func2
在定义时没有任何className
的信息。当我们在类MyObj
中复制函数func2
时,this
现在引用新类,因此您得到了ogthis.className='MyObj'
const obj={
范围:本,,
func1:()=>{返回此},
func2:函数(){
常数fn=()=>这个;
console.log(this.className)
返回fn();
}
}
MyObj类{
构造函数(){
this.className='MyObj'
这个,obj()
}
obj(){
this.func2=obj.func2
}
打印(){
这个.func2()
}
}
var myObj=新的myObj()
myObj.print()
当您