为什么这段JS代码输出5、undefined、5而非5、undefined、10?
var x = 5; function y(){ x=10; return function x(){} } console.log(x); //5 console.log(y()); //undefined console.log(x); //5
这个现象是函数声明提升和**自动分号插入(ASI)**两个JavaScript核心机制共同作用的结果,具体原因拆解如下:
- 函数声明会在当前所在作用域顶部完成提升:
y函数内部的function x(){}属于函数作用域内的函数声明,在进入y函数、正式执行代码前的编译阶段,就已经在y的作用域内创建了局部变量x,值为这个声明的函数,不需要向上查找全局的x。 - 执行
y内部的x = 10时,修改的是上面提到的局部变量x,全局作用域的x完全没有被改动,依然保留初始值5。 return后直接换行触发了自动分号插入规则,JavaScript会自动在return后插入分号,相当于实际执行的是return;,后续的代码不会运行,函数直接返回undefined,所以第二个打印结果符合预期。- 最后打印的
x是全局作用域下的变量,自然还是初始的5。
如果删除function x(){}这一行,y的函数作用域内就没有局部的x变量,执行x = 10时会向上层作用域查找,最终修改的是全局的x,所以最后打印结果就是10,符合你的预期。
内容的提问来源于stack exchange,提问作者user14610044
相关产品推荐
相关产品推荐

