扫码关注官方订阅号
(function(){ a = 5; alert(window.a); var a = 10; alert(a); })();
这段代码中a是全局对象,为什么alert(window.a);会显示undefined
认证0级讲师
问题中的代码等于一些以下代码
(function(){ var a; a = 5; alert(window.a); a = 10; alert(a); })()
这一段代码涉及到了变量声明提升解析器在解析的时候,会把var a = 10;在这个匿名函数里,会被提前为var a;也就是说,会在函数内部一开始就声明这个变量。如此,a就变成了局部变量,js有一个作用域链的概念,当遇到变量的时候,从自己当前的函数的作用域中开始查找是否声明了此变量,如果有,则使用,若没有,那么去查找包含这个函数的函数中是否存在这个变量,一级一级直到全局。这个过程是一步步执行的,也就是说,若在自己的函数内部找到,那么就不会继续寻找。所以,当检测到a存在时,就使用它,但是a没有定义,所以undefined。
相当于:
(function() { var a;//局部变量 a = 5; alert(window.a); a = 10; alert(a); })();
var a = 10 ;var a 被提示到了函数的最开始,a变成了函数的局部变量。
变量提升
题主可以去查一下 js 的声明提前问题,其实对于上面的代码对于解析器来说是这样的:
(function(){ var a; a = 5; alert(window.a); a = 10; alert(a); })();
所以变量a并不是全局变量,所以实际开发中最后不要这样声明全局变量,
在(function(){a = 5;alert(window.a);var a = 10;alert(a);})()整个函数的作用域里面,第一步,首先看所有var声明的变量,如果有var声明的变量,它会提前拿到作用域里面,在a=5之前,这个函数的作用域里面有[a,window],然后我们看a=5,此时作用域里面有a,所以他不是全局变量a,而是对局部变量a赋值,然后你alert(window.a);全局里面没有a,所以是undefined,后面的就不解释了。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
问题中的代码等于一些以下代码
这一段代码涉及到了变量声明提升
解析器在解析的时候,会把var a = 10;在这个匿名函数里,会被提前为var a;也就是说,会在函数内部一开始就声明这个变量。
如此,a就变成了局部变量,js有一个作用域链的概念,当遇到变量的时候,从自己当前的函数的作用域中开始查找是否声明了此变量,如果有,则使用,若没有,那么去查找包含这个函数的函数中是否存在这个变量,一级一级直到全局。这个过程是一步步执行的,也就是说,若在自己的函数内部找到,那么就不会继续寻找。
所以,当检测到a存在时,就使用它,但是a没有定义,所以undefined。
相当于:
var a = 10 ;
var a 被提示到了函数的最开始,a变成了函数的局部变量。
变量提升
题主可以去查一下 js 的声明提前问题,其实对于上面的代码对于解析器来说是这样的:
所以变量a并不是全局变量,所以实际开发中最后不要这样声明全局变量,
在(function(){
a = 5;
alert(window.a);
var a = 10;
alert(a);
})()整个函数的作用域里面,第一步,首先看所有var声明的变量,如果有var声明的变量,它会提前拿到作用域里面,在a=5之前,这个函数的作用域里面有[a,window],然后我们看a=5,此时作用域里面有a,所以他不是全局变量a,而是对局部变量a赋值,然后你alert(window.a);全局里面没有a,所以是undefined,后面的就不解释了。