扫码关注官方订阅号
(function(){ a = 5; alert(window.a); var a = 10; alert(a); })();
这段代码中的alert,为什么第一个是返回的undefined.按说,不要VAR的a变量,不就是全局变量吗?
闭关修行中......
变量提升啊,下面有var a 啊,你知道变量提升吗?
程序运行分为两个阶段,第一是编译阶段(在当前作用域注册变量),第二是运行阶段。
程序首先编译这段代码,其他都不管,只关注变量和函数的声明。首先看到var a,就在你的当前作用域IIFE函数中注册a这个变量。
var a
然后进入运行阶段。遇到a = 5时,首先是寻找a这个变量是否已经在当前作用域注册了?如果已注册,就使用当前作用域的a,并给他赋值5.如果在当前作用域没找到已注册的变量a,这时就会向外一层作用域寻找,也就是全局作用域寻找a。
a = 5
随后执行alert(window.a),这时是寻找window对象的a属性,此时window对象并没有a属性,所以此时结果是undefined。如果你在IIFE函数外赋值a = 20,这时结果就是20了。
alert(window.a)
window
a
undefined
a = 20
随后a = 10寻找变量a并赋值10(运行过程同第三段)。
a = 10
最后alert(a),查找当前作用域是否有变量a,如果有,则返回该变量的值。否则向外一层寻找,如果在全局作用域都没有找到a,这时程序就会报ReferenceError: a is not defined的错误。
alert(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中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
变量提升啊,下面有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
自己待填坑的文章
嗯,变量提升,变量声明会提前到最前面,与输写的顺序无关。
之前的回答感觉有不正确的地方,自己下去又研究了下,`
这个代码中a=5在程序执行时这个a是局部变量a,而不是全局变量a,因为下面的var a=10;导致变量声明提升到程序最顶部,也就是a=5之前了,所以执行a=5时其实是对局部变量的赋值。window.a中的a是window对象的一个属性,因为从未赋值,所以一直是未定义,这句话放在这个匿名函数内的任何位置输出都是未定义。