var name = "lee";
function echo(){
console.log(name);
var name = "jack";
}
echo();
居然输出的是 undefined , undefined 不是变量定义未赋值吗?可是在 echo 函数里给 name 初始化了啊 有点蒙了
var name = "lee";
function echo(){
console.log(name);
var name = "jack";
}
echo();
居然输出的是 undefined , undefined 不是变量定义未赋值吗?可是在 echo 函数里给 name 初始化了啊 有点蒙了
@Lxxyx 答的已经很好了,为了通俗的理解我再废话一遍
当js解释器执行到 console.log(name);
的时候,会去当前作用域(当前作用域为 function echo()
)下去找 name
, 如果没有 var name
那么继续向上层找。如果上层也没有那么会继续向上层找。一只到顶层全局,浏览器里面就是window
了。
但是echo()
里面有了 var name
就会告诉解释器,哥地盘里面有name
这个小弟,憋出去找了。在哥地盘找吧。那小弟name
叫啥?到这行还没给起名呢,后来才起名的,你要现在问我:sorry I donot know。
哈哈瞎扯的,能帮助你理解就好了。
8 回答4.5k 阅读✓ 已解决
6 回答3.1k 阅读✓ 已解决
5 回答2.7k 阅读✓ 已解决
5 回答6.2k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
3 回答2.4k 阅读
4 回答2.7k 阅读✓ 已解决
变量提升。
函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部。
而且在函数域里定义一个和外部变量一样名称的变量时,变量的声明会提升至第一句,赋值则不会变。
且原型链在函数内找到变量,就不会继续向上寻找了。
这是你的代码。
你的代码的实际效果是
所以
console.log(name)
时候,name
还是undefined
。且原型链在函数内找到变量,就不会继续向上寻找。所以全局的
name = lee
是不起作用的。