Javascript Arrow函数和Normal函数的代码片段和行为

Javascript Arrow函数和Normal函数的代码片段和行为,javascript,ecmascript-6,arrow-functions,Javascript,Ecmascript 6,Arrow Functions,有人能帮我理解下面的es6小程序的输出吗 我知道箭头函数和普通函数的区别 Arrow函数在父对象的作用域中运行。 正常函数在其自己的范围内运行 PFB让我困惑的节目 function Temp(){ this.x =99; y =88; var z =77; setTimeout(function(){console.log(this.y+"::",this.x,"--",this.z),5}); setTimeout(()=>{console.log(this.y+

有人能帮我理解下面的es6小程序的输出吗

我知道箭头函数和普通函数的区别

Arrow函数在父对象的作用域中运行。 正常函数在其自己的范围内运行

PFB让我困惑的节目

function Temp(){
  this.x =99;
  y =88;
  var z =77;

  setTimeout(function(){console.log(this.y+"::",this.x,"--",this.z),5});
  setTimeout(()=>{console.log(this.y+"||",this.x,"--",this.z),5});

  doit(function (){ console.log(this.y+":",this.x,"_",this.z);})
  doit(()=>{console.log(this.y+"|",this.x,"-",this.z);});

  function doit(task){
    this.i =0;
    task();
  }
}

new Temp();
输出

es6游乐场


想知道变量声明和函数arrow/normal之间的关联。

如果您未声明变量,例如未使用此.y或const、let和var中的一个,则它将附加到浏览器的全局范围,即窗口

调用匿名函数时,它使用全局作用域窗口

我对你的代码添加了注释

函数温度{ this.x=99;//本地范围 y=88;//由于未声明全局作用域,所以它附加在窗口上 //这个,y永远不会 setTimeoutfunction{//作用域为窗口/全局 console.log'log1',this.y+:,this.x }, 5; setTimeout=>{//作用域是临时的 console.log'log2',this.y+| |,this.x }, 5; doitfunction{//,因为它是一个匿名函数 //现在的范围是window console.log'log3',this.y+:,this.x; } doit=>{//Arrow函数:临时 console.log'log4',this.y+|,this.x; }; 函数doittask{ 这个。i=0; 任务 } }
新温度;那么问题到底是什么:尝试您应该始终使用的严格模式,y=88将抛出相应的错误。以及访问一个未定义的数据库的属性。对问题进行了一个小的编辑,你能再看一次吗。你对y声明的评论真的很有帮助。尽管有人怀疑y是否在全局范围内用声明,但它应该由arrow函数访问。不是吗?
88:: undefined --undefined 
undefined|| 99 --undefined 
88: undefined -undefined 
undefined| 99-undefined