预处理包括
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