JavaScript中的作用域的问题

var name = "lee";
function echo(){
    console.log(name);
    var name = "jack";
}

echo();

居然输出的是 undefined , undefined 不是变量定义未赋值吗?可是在 echo 函数里给 name 初始化了啊 有点蒙了

阅读 3.6k
6 个回答

变量提升。
函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部。

而且在函数域里定义一个和外部变量一样名称的变量时,变量的声明会提升至第一句,赋值则不会变。
且原型链在函数内找到变量,就不会继续向上寻找了。

这是你的代码。

var name = "lee";
function echo(){
    console.log(name);
    var name = "jack";
}

echo();

你的代码的实际效果是

var name = "lee";
function echo(){
    var name;
    console.log(name);
    name = "jack";
}
echo();

所以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函数里面的

var name='jack';

改为

name='jack'

就可以正常echo了

1 篇内容引用
推荐问题
宣传栏