javascript - 老规矩,先上代码,帮忙指点下变量作用域
阿神
阿神 2017-04-11 13:28:40
[JavaScript讨论组]
(function(){
a = 5;
alert(window.a);
var a = 10;
alert(a);
})();

这段代码中的alert,为什么第一个是返回的undefined.按说,不要VAR的a变量,不就是全局变量吗?

阿神
阿神

闭关修行中......

全部回复(4)
巴扎黑

变量提升啊,下面有var a 啊,你知道变量提升吗?

阿神

程序运行分为两个阶段,第一是编译阶段(在当前作用域注册变量),第二是运行阶段。

程序首先编译这段代码,其他都不管,只关注变量和函数的声明。首先看到var a,就在你的当前作用域IIFE函数中注册a这个变量。

然后进入运行阶段。遇到a = 5时,首先是寻找a这个变量是否已经在当前作用域注册了?如果已注册,就使用当前作用域的a,并给他赋值5.如果在当前作用域没找到已注册的变量a,这时就会向外一层作用域寻找,也就是全局作用域寻找a。

随后执行alert(window.a),这时是寻找window对象的a属性,此时window对象并没有a属性,所以此时结果是undefined。如果你在IIFE函数外赋值a = 20,这时结果就是20了。

随后a = 10寻找变量a并赋值10(运行过程同第三段)。

最后alert(a),查找当前作用域是否有变量a,如果有,则返回该变量的值。否则向外一层寻找,如果在全局作用域都没有找到a,这时程序就会报ReferenceError: a is not defined的错误。

关于作用域,推荐You Don't Know JS

自己待填坑的文章

天蓬老师

嗯,变量提升,变量声明会提前到最前面,与输写的顺序无关。

迷茫

之前的回答感觉有不正确的地方,自己下去又研究了下,`

(function(){
a = 5;
alert(window.a);
var a = 10;
alert(a);
})();`

这个代码中a=5在程序执行时这个a是局部变量a,而不是全局变量a,因为下面的var a=10;导致变量声明提升到程序最顶部,也就是a=5之前了,所以执行a=5时其实是对局部变量的赋值。window.a中的a是window对象的一个属性,因为从未赋值,所以一直是未定义,这句话放在这个匿名函数内的任何位置输出都是未定义。

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

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