js 预编译

function fn(a){
	console.log(a);
	var a=123;
	console.log(a);
	function a(){}
	console.log(a);
}
fn(1);
//输出:ƒ a(){}
//输出:123
//输出:123

预编译过程:

  1. 创建AO对象
  2. 找形参和变量声明,将形参和变量作为AO的属性值,值为undefined
  3. 将实参和形参统一
  4. 在函数体内找函数声明,值为函数体

备注:预编译发生在函数执行的前一刻

记一面试题:

var a=0;
console.log('window.a:'+window.a,'a:'+a,'outer a=0');//输出:window.a:0 a:0 outer a=0
if(true){
	a=1;
	console.log('window.a:'+window.a,'a:'+a,'inner1 a=1');//输出:window.a:0 a:1 inner1 a=1
	function a(){};
	console.log('window.a:'+window.a,'a:'+a,'inner2 function');//输出:window.a:1 a:1 inner2 function
	a=21;
	console.log('window.a:'+window.a,'a:'+a,'inner3 a=21');//输出:window.a:1 a:21 inner3 a=21
}
console.log('window.a:'+window.a,'a:'+a,'outer');
//输出:window.a:1 a:1 outer

此题纠结很久,也找过答案,但是任然不太能理解输出结果。唯一庆幸的是现在if里面是不允许声明函数的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值