js变量提升理解,特别是闭包中的变量提升行为

先来看一个例子

var name = 'World!';
var t = {name:"w"};
(function () { 
	//console.log(this);
	console.log(t);
	//console.log(name);
	if (typeof name === 'undefined') { 
  		var name = 'Jack'; 
  		console.log('Goodbye ' + name); 
	}else{ 
  		console.log('Hello ' + name); 
	} 
})();

输出结果为:

World!
{name: "w"}
undefined
Goodbye Jack

该代码执行输出的结果为 Goodbye Jack,而不是Hello World,也不是Hello Jack;

为什么?

因为(function(){})();这样写法的内部function是一个局部函数,而且函数执行之前,必须等待function内的所有变量都声明了才会开始执行,就像java的局部变量一样,java的方法内的局部变量并不是执行到哪一行才去声明的,而是初始化方法时,先扫描所有局部变量,并声明所有的局部变量的内存才开始执行的

同理闭包(function(){})();内的function也是先声明所有局部变量才去执行,因为function内声明了name所以会初始化一个局部变量name=undefined才开始执行方法,而执行到if (typeof name === 'undefined') ,因为存在局部变量name,所以方法不会提升变量name的范围,故这时name仍然是undefined,而不是外部声明的全局变量的值World,这就是为什么typeof name === 'undefined'是true,方法输出结果为Goodbye Jack。 

而t因为function内不存在局部变量声明(var,let,const等声明关键字修饰),所以不会先初始化t的内存,而是等到执行时才是提升变量范围访问全局变量中的t,如果提升变量范围也没有对应的声明,那就再重新初始化(仅js这种存在自动识别并声明变量的语言才会,如果是java直接编译不通过)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值