var name = "lee";
function echo(){
console.log(name);
var name = "jack";
}
echo();
居然输出的是 undefined , undefined 不是变量定义未赋值吗?可是在 echo 函数里给 name 初始化了啊 有点蒙了
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
变量提升。
函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部。
而且在函数域里定义一个和外部变量一样名称的变量时,变量的声明会提升至第一句,赋值则不会变。
且原型链在函数内找到变量,就不会继续向上寻找了。
这是你的代码。
你的代码的实际效果是
所以
console.log(name)
时候,name
还是undefined
。且原型链在函数内找到变量,就不会继续向上寻找。所以全局的
name = lee
是不起作用的。你那变量还没生下来,仅仅怀孕而已
函数里面的name是局部变量,是下面那个声明并赋值name,再加上在函数内部任何位置申明的变量在整个函数内部都是可见的,所以输出为未初始化
执行上下文过程中进行变量声明,变量提升
@Lxxyx 答的已经很好了,为了通俗的理解我再废话一遍
当js解释器执行到
console.log(name);
的时候,会去当前作用域(当前作用域为function echo()
)下去找name
, 如果没有var name
那么继续向上层找。如果上层也没有那么会继续向上层找。一只到顶层全局,浏览器里面就是window
了。但是
echo()
里面有了var name
就会告诉解释器,哥地盘里面有name
这个小弟,憋出去找了。在哥地盘找吧。那小弟name
叫啥?到这行还没给起名呢,后来才起名的,你要现在问我:sorry I donot know。哈哈瞎扯的,能帮助你理解就好了。
不看 @Lxxyx 的答案我也纳闷呢。。。没错, 你把echo函数里面的
改为
就可以正常echo了