let x = 1;
function foo( y = function() { x = 2; }) {
var x;
y();
}
foo();
这个函数执行到y的时候x会自动等于1
let x = 1;
function foo( y = function() { x = 2; }) {
let x;
y();
}
foo();
这块执行到y的时候x则是undefined
问题一:
为什么两次函数中的初始化x值不一样?这是var复用的上级let吗?
问题二:
这俩函数执行后最后结果都是2,为什么函数内的let修改会影响上级?请大神详细解释一下,这块看了半天没懂
先看代码: 第一个: let 定义了一个块级变量x=1,你创建了一个全局函数foo,foo的参数y= function(){x =2},这个y是一个全局变量,y作为参数传给了foo,那么在foo中重新定义了x,没有赋值,此时x为undefined.当你再调用y函数的时候,x用的是let定义的x,为1; 紧接着,你把2赋给了x,此时let定义的x为多少都不影响最终x为2;
第二个:那就比较清晰了,不管let定义x为多少,当你执行foo函数,再执行y函数时,这里x被重新定义为2,那么之后你使用x都是2了。至于y之前是undefined,道理同一,定义后未初始化变量,均为undefined。
能给好评吗TT
多谢,清晰明白,是我一开始想错方向了
@刘冰0117: 不客气~
确定第一个执行到y的时候x的值是1?在执行y之前log一下看到的是undefined啊?
你再chrome里面打断点试一下
@刘冰0117: 不好意思,问一下,你是说y里面还是y前面
1,var会变量提升,既函数会最先执行var x的语句,不管位于哪里,且var是全局作用域,2,而let是快作用域,并且没有变量提升,3,函数内部是单独的作用域;两者的区别可以看https://www.cnblogs.com/mrzhou1944/p/14259674.html