Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“什么是”呢;这";在JavaScript中的箭头函数中_Javascript_Node.js_Scope_This_Arrow Functions - Fatal编程技术网

“什么是”呢;这";在JavaScript中的箭头函数中

“什么是”呢;这";在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

我有一个关于箭头函数中“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(“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
    现在引用新类,因此您得到了og
    this.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()
    当您