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里面是不允许声明函数的。

 

你可能感兴趣的:(面试题,前端开发)