JavaScript中的作用域的问题
ringa_lee
ringa_lee 2017-04-10 16:32:02
[JavaScript讨论组]
var name = "lee";
function echo(){
    console.log(name);
    var name = "jack";
}

echo();

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

ringa_lee
ringa_lee

ringa_lee

全部回复(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是不起作用的。

巴扎黑

你那变量还没生下来,仅仅怀孕而已

ringa_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了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号