JavaScript中为何代码返回第二个函数b的8而非第一个的3?
为什么你的JavaScript代码返回8而不是3?
这是**函数声明的变量提升(Hoisting)**导致的结果,核心原因是:函数声明会被完整提升到当前作用域的顶部,且同名的函数声明,后面的会直接覆盖前面的。
拆解你的代码执行过程
当你调用a()时,JavaScript引擎会先处理a函数内部的变量提升阶段,再执行代码:
- 变量提升阶段:把所有函数声明移到
a函数作用域的最顶部。你的代码里有两个function b()声明,提升后顺序是:function b() { return 3; } function b() { return 8; } // 这个声明直接覆盖了前面的b - 代码执行阶段:此时开始按顺序执行代码,遇到
return b()时,b已经被后面的函数声明覆盖了,所以调用的是返回8的那个b函数,最终结果就是8。
补充说明
如果把函数声明改成函数表达式(比如var b = function(){ return 3; }),就不会出现这种覆盖——因为变量提升只提升变量声明,不提升函数体,只有后面的赋值操作才会改变变量指向,但你的代码用的是函数声明,所以会被完整提升并覆盖。
内容的提问来源于stack exchange,提问作者Anish Kulshreshtha
相关产品推荐
相关产品推荐

