javascript - 求解一个关于js 变量声明和定义以及函数调用的问题
ringa_lee
ringa_lee 2017-04-11 13:29:28
[JavaScript讨论组]

作为Js初学者而言,这是一个令我费解的问题,代码如下:
var a = 'a';
(function(){
console.log(a);
var a = 'b';
})();

如下是在chrome浏览器中调用后的结果:

自己的理解是,Js在编译时会对变量和函数进行扫描,然后再按照顺序执行,在自执行函数内部,首先先声明var a,再按照顺序执行,所以上面的代码可以看成是如下执行顺序:
var a = 'a';
(function(){
var a;
console.log(a);
var a = 'b';
})();

所以输出的是undefined

不知道理解的是否正确。如果不正确的话,希望能够解释一下!

ringa_lee
ringa_lee

ringa_lee

全部回复(6)
迷茫

正解,函数内部声明提前,赋值保持不变,执行console.log时只声明了,而没有赋值

大家讲道理

你理解的代码是对的,专业名词叫 变量提升(Hoisting)

意思是: 在函数作用域内,会把所有的变量在作用域之前声明,但要注意的是 Hoisting 只在函数作用域内起作用,如果你把function(){} 换成 if(){} 或者 for(;;){} 那就不是输出undefined 了 而是正常输出

大家讲道理

var a;
console.log(a);
a = 'b';

定义一次就 ok 了

伊谢尔伦

正解,代码声明提前。建议题主去刷一本书. JavaScript高级程序设计,刷完之后,js基本没有盲点。

天蓬老师

js是先定义所有变量, 在通过程序流程去给变量赋值,执行操作, 所以会先

var a;  
console.log(a); 

这里控制台打印出来的a是undefined;
如果想使用a的话 要在调用a这个变量之前先赋值。

ringa_lee

正解,var会变量提升,其实现在大部分的var都可以换成let

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

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