为什么下述JS代码片段执行输出undefined而非预期的test?
输出undefined的核心原因
这个运行结果是JavaScript中var关键字的变量提升(Hoisting)特性,配合作用域就近查找规则导致的。
实际执行逻辑拆解
JS引擎在执行函数前,会先扫描当前函数作用域内所有用var声明的变量,将变量声明部分提升到函数作用域的最顶部,赋值操作保留在代码原位置不动,且var声明的未赋值变量默认初始值为undefined。
你提供的原始代码在运行时会被隐式转换为如下逻辑:
// 全局作用域 var name = "test"; function message() { // 函数内var name的声明被提升到作用域顶部,初始值为undefined var name; console.log(name); // 访问当前函数作用域的name,值为undefined name = "test 2"; // 原位置的赋值,执行到此处局部name才会被更新为"test 2" } message();
为什么没有访问到全局的"test"
JS的变量查找遵循就近优先原则:访问变量时会从当前执行上下文的最近作用域开始查找,一旦找到匹配的变量就直接使用,不会继续向外层作用域遍历。
由于你在message函数内部声明了同名的局部变量name,执行console.log(name)时,引擎直接命中了函数作用域内刚被提升、还未完成赋值的局部name,不会向外访问全局作用域中值为"test"的同名变量,因此最终输出undefined。
拓展说明
- 如果将函数内的
var替换为let/const,运行时不会输出undefined,而是直接抛出ReferenceError:let/const声明的变量存在暂时性死区,在声明语句执行前访问变量会直接报错,不会像var一样默认初始化为undefined。 - 如果想要得到预期的
test输出,只需要删除函数内部的var name = "test 2"语句,函数作用域内不存在同名局部变量时,引擎就会向外层全局作用域查找,拿到值为"test"的全局name。
内容的提问来源于stack exchange,提问作者Docu Care
相关产品推荐
相关产品推荐

