预处理包括
1收集var 声明的变量提升
2.收集函数声明提升
常见的面试题:
-----------------------------------------------------------------------------------------------------------
变量和函数不同名
1.
var a=2; function fn(){ console.log(a); a=3; } fn();
输出结果为2
var a=2; function fn(){ console.log(a); var a=3; } fn();
输出结果为undefined
关键在于var a=3;这里有变量提升
相当于执行了
var a=2; function fn(){ var a;//对a进行了初始化 console.log(a); var a=3; } fn();
-----------------------------------------------------------------------------------------------------------
2.
function foo(){ console.log("函数声明"); } var foo; console.log(typeof foo); console.log(foo);
输出结果为function,
function foo(){ console.log("函数声明"); }
function foo(){ console.log("函数声明"); } var foo="test"; console.log(typeof foo); console.log(foo);
输出结果为
string
test
变量和函数同名的情况下
var c=1; function c(){ } console.log(c); 输出为1
var a; function c(){ } console.log(c); 输出为 function c(){ }
==》function声明的变量优先级高于var声明的变量,声明不会被覆盖,但是值会被覆盖
变量重名
var a=1; var a; console.log(1);
这里第二行对a是一个重复宣告,而不是赋值,变量只有定义(宣告)后未赋值的情况下才会输出undefined,除非手动赋值undefined;那么这里,JS引擎对于重复宣告的规定以最近的变量指定(也就是赋值)作为变量在执行时的值,所以第二行的
其实相当于无效;
函数内部形参和内部的变量重名的情况
function c(c) { console.log(c); var c = 3; console.log(c); } c(1);
输出为1,3
虽然内部有变量声明提升,但是是一个重复宣告,而不是赋值,所以第一个c为1,除非手动赋值undefined;
然后看下阿里面试题
var c = 1; function c(c) { console.log(c); var c = 3; } console.log(c); c(2);
输出结果为
1
Uncaught TypeError: number is not a function
var c = 1; function c(c) { var c; console.log(c); c = 3; } console.log(c); c(2);
这里第一个输出1就不说了,第二个这里有个坑。
其实外面的执行是如下的
function c(c) { var c; console.log(c); c = 3; } var c=1; console.log(c); c(2);
所以第二步执行c(2);自然会报Uncaught TypeError: number is not a function
3
(function(b) { console.log(b) var b = c = 2 console.log(b) function b() {} console.log(b) })(1)
输出结果为
function b() {}
2
2
相当于执行了
(function(b) { function b() {} var b; console.log(b) b = c = 2 console.log(b) console.log(b) })(1)
虽然外面给内部传了个参数,函数声明将值给覆盖了,所以输出为函数的引用,2,2
修改于18/3/15