js变量提升

小精豆2016
小精豆2016 发布于 2016-10-21 10:00:02 浏览:325 类型:原创 - 随笔 分类:JavaScript - js知识点 二维码: 作者原创 版权保护
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script>
		var v = 'hello';
		(function(){
			alert(v);
			var v ='world';
		})();
	</script>
</body>
</html>

会出现alert出来的是undefined,原因是因为在函数域里定义一个和外部变量一样名称的变量时,变量的声明会提升至第一句,赋值则不会变。所以上述语句其实是这样执行的
<script>
		var v = 'hello';
		(function(){
			var v;
			alert(v);
			var v ='world';
		})();
	</script>

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

这个先打印出 undefined 然后是10
第一个 a=5 没用var, 它并没有创建变量a, 而是向上级作用域找变量a, 自然是找不到, 所以会创建a, 但创建的a是本域的, 不是window域(顶级域)的, 所以window.a还是undefined .

var a=undefined;  
(function(){
    var a;    //局部变量a,默认值是undefined
    a = 5;    //因和局部变量名相同,因此全局变量a被覆盖,此处变成了给局部变量a赋值
    //alert(a);  弹出5
    //a只是变量,而不是属性 alert(a in window)返回false  ,参见http://segmentfault.com/q/1010000002883076 的第一个回答
    alert(window.a);  
    a = 10;
    alert(a);
})();
z
给个赞 2 人点赞
收藏 1 人收藏
评论 已有 4 条评论;以下用户言论只代表其个人观点,不代表 前端网(QDFuns) 的观点或立场。
登录 以后才能发表评论
最新评论
Joudee
Joudee2016-11-25 14:25:344F
就是var a = function(){}和function a(){}的区别 //@小精豆2016:亲,可以帮忙写一下吗,对这一块还不太了解 //@Joudee:少一个函数提升,js里函数也可以作为变量
举报 支持 (0) 回复 (0)
fantasy525
fantasy5252016-10-22 18:23:153F
有个疑问,你的第二个代码我也研究了好久,我现在再看加上看了你的理解,就觉得其实a并不是在a=5时找不到才在全局变量创建a的,而是在alert(window.a)时找不到window作用域下的a才开始创建的
展开代码
(function(){
    a = 5;
    alert(window.a);
    var a = 10;
    alert(a);
})();
//但是我又有了新的理解,如下
(function(){
    var a;//a=undefined;变量提升机制
    a = 5;//此时a是上面声明的局部变量a;因为已经由于变量提升而声明过a了,所以没有去顶级域找a,直接赋值了
    alert(window.a);//由于window作用域里面始终没有声明a,更别说赋值了,所以找不到a,那么找不到就要创建a,但是始终未赋值,
    //无论这行代码放在匿名函数的任何位置都输出的是未定义
    var a = 10;
    alert(a);
})();

我之前的理解跟你的差不多,我之前的理解是:" 程序执行到a=5时开始找a,找到顶级域也没有所以就在顶级域创建了a;但由于和局部变量a名字一样所以被覆盖 ".但是我现在最新的理解跟你的理解区别就在创建全局变量a的时间,我理解a=5时没有因为找不到a而在全局创建,而是此时a已经声明为局部变量了,所以直接赋值了,到alert(window.a)时因为找不到a没有人声明过,此时才开始创建全局变量a,但未赋值就输出未定义。以上是我的一点看法,不知你是否赞同?
举报 支持 (0) 回复 (0)
小精豆2016
小精豆20162016-10-21 14:30:192F
亲,可以帮忙写一下吗,对这一块还不太了解 //@Joudee:少一个函数提升,js里函数也可以作为变量
举报 支持 (0) 回复 (1)
Joudee
Joudee2016-10-21 11:35:251F
少一个函数提升,js里函数也可以作为变量
举报 支持 (0) 回复 (1)
小精豆2016 小精豆2016 作者

作者最新