块级作用域中的函数声明

{  
	console.log(window.a,a)   //全局 undefined   局部 fn
	a = 2;
	console.log(window.a,a)   //全局 undefined   局部 2
	a = 3;
	console.log(window.a,a)   //全局 undefined   局部 2
	function a(){}           //执行完之后全局变为3 函数声明之后将全局变量赋值为函数声明之前的局部变量值
				
	console.log(window.a===a,a) //全局 3   局部 3
	a = 4;  
	console.log(window.a,a); //全局3  局部4
}
	console.log(window.a,a); //全局 3
  •   预编译时,将块级作用域中的函数声明同时提升到全局和块内顶部,但块内顶部的赋值为function a(){}  ,全局的赋值为undefined
  •   a = 2,a = 3 都改的块级中的 a,执行完 a = 3 时块内中的a变为3,全局中的不变;
  •   块内执行到函数声明时,由于函数不具备块级作用域,会将全局中的a改为块内中的a,即,window.a = 3;
  •   后面执行a = 4时,会顺着作用域链往上找,由于块级中已经有a了,因此会将块级中的a的改为4,局部不变;
  •   块级作用域中执行到函数声明时会将a提升到全局,没有执行函数声明之前提升到块级顶部; 
  • {
    	function a(){};
    }
    console.log(a); //会输出function a(){}
  •  但在局部作用域(函数内)中函数声明不会提升到全局中,只能在局部作用域顶部;
  • function b(){
        function a(){};
    }
    console.log(a); //报错

块级作用域中函数声明可以打断点,但在局部作用域中不能打断点,也就是说在块级作用域中函数声明会执行,但在局部作用域中函数声明,只做声明,本身自身不执行

块级:块级作用域中的函数在预编译的时候会被提升到全局中单赋值为undefined,只有在执行到函数声明时才是赋值,

此时全局并未定义a,但是可以在全局中看见有a=undefined,说明预编译时已将块内的函数提上来但赋值为undefined,执行完函数声明之后a = 3,将全局中的a改为3

注释函数声明之后,预编译时全局中就不会出现a

 

函数函数内的函数声明不会提升到全局中

将块换为函数之后,全局中就不会出现a 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值