扫码关注官方订阅号
(function(){ a = 5; alert(window.a); var a = 10; alert(a); })();
这个先打印出 undefined 然后是10,为什么呀?
欢迎选择我的课程,让我们一起见证您的进步~~
第一个 a=5 没用var, 它并没有创建变量a, 而是向上级作用域找变量a, 自然是找不到, 所以会创建a, 但创建的a是本域的, 不是window域(顶级域)的, 所以window.a还是undefined .
(function(){ a = 5; alert(a); //==> 5 alert(window.a); //==> undefined var a = 10; alert(a); //==> 10 })();
因为a在下面被声明过了,所以预解释为undefined,window.a之前a没有赋值,所以为undefined,下面的a声明并且赋值所以为10
@不写代码的码农 首先他的回答已经很好了,希望你明白,作为初学者,说说我个人的比较通俗的理解,望指正。
javascript (function(){ a = 5; alert(window.a); var a = 10; //由于声明提前,var a是这个匿名函数中的局部变量,js引擎会在执行前 // 最先编译。 //所以,第一行的a=5其实不是创建了全局变量,而是对编译期间的局部变量 // a赋值5. //但是,为何alert(window.a)会是undefined,是因为他指定了要输出的 //是window.a //这是要输出window的属性a,没有这个a,因此会是输出undefined(此 //处,我也有疑问, //为何不会出现referenceError),之后再赋值10,那么输出的就是10了 alert(a); })();
javascript
(function(){ a = 5; alert(window.a); var a = 10; //由于声明提前,var a是这个匿名函数中的局部变量,js引擎会在执行前 // 最先编译。 //所以,第一行的a=5其实不是创建了全局变量,而是对编译期间的局部变量 // a赋值5. //但是,为何alert(window.a)会是undefined,是因为他指定了要输出的 //是window.a //这是要输出window的属性a,没有这个a,因此会是输出undefined(此 //处,我也有疑问, //为何不会出现referenceError),之后再赋值10,那么输出的就是10了 alert(a); })();
其中,我不明白的地方提出来了,可能有误,希望指正。-----初学
你可以把那个未声明的变量a当作不存在 这样就会好一些
(function(){
a = 5; //没有用var声明的变量,它才会在全局对象(即当前作用域链的最顶层对象,如window对象创建一个变量--全局变量),所以window.a应该相当于var a;所以window.a是undefined。 alert(window.a); var a = 10; alert(a);
})();
需要知道js的预编译模式的函数声明会先找到变量赋值语句,并将其置于函数顶,赋值为undefined.了解完这个自己就能读懂了, 虽然a=5看上去是声明了一个全局变量,但是后面有一个var a = 10所以导致变量提升,所以代码预编译完成之后会变成下面这个样子:
a=5
var a = 10
(function(){ var a; // undefined a = 5; // 5 alert(window.a); //此时的a的scope是该函数 var a = 10; //10 alert(a); //10 })();
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
第一个 a=5 没用var, 它并没有创建变量a, 而是向上级作用域找变量a, 自然是找不到, 所以会创建a, 但创建的a是本域的, 不是window域(顶级域)的, 所以window.a还是undefined .
因为a在下面被声明过了,所以预解释为undefined,window.a之前a没有赋值,所以为undefined,下面的a声明并且赋值所以为10
@不写代码的码农 首先他的回答已经很好了,希望你明白,作为初学者,说说我个人的比较通俗的理解,望指正。
其中,我不明白的地方提出来了,可能有误,希望指正。-----初学
你可以把那个未声明的变量a当作不存在 这样就会好一些
(function(){
})();
需要知道js的预编译模式的函数声明会先找到变量赋值语句,并将其置于函数顶,赋值为undefined.
了解完这个自己就能读懂了, 虽然
a=5看上去是声明了一个全局变量,但是后面有一个var a = 10所以导致变量提升,所以代码预编译完成之后会变成下面这个样子: