我们都知道js代码是由自上而下的执行,但我们来看看下面的代码;
test();
function test(){
console.log("hello world");
};
如果我们简单的认为js是由自上而下的执行,那么上面的代码应该会报错,提示test 不是一个方法;但结果并没有报错,而是进行正确的输出了;
这样我们就应该知道js执行分为两部分
1.预解析;2.执行
预解析会将var 定义的变量及function进行提前处理;
也就是说上面的代码会被处理为
function test(){
console.log("hello world");
}
test();
所以调用并没有报错;
下面我们再来测试var
alert(a);
var a=1;
这时候弹出的是undefined;注意,并没有报错;
而上面的代码其实是被预解析为
var a;
alert(a);
a=1;
所以弹出的是一个undefined;
当变量与函数同名的时候,会忽略变量的提升,下面我们看一个例子
console.log(test);
function test(){
}
console.log(test);
var test=123;
console.log(test);
上面的代码会被预处理为
function test(){
}
console.log(test);
console.log(test);
test=123;
console.log(test);
我们可以看出变量名提升被忽略了;
函数表达式不会被提升的,如
test();
var test=function(){
};
这时候运行,就会报错;提示test不是一个方法;
预处理的代码为
var test;
test();
test=function(){
};
js中没有块级作用域;
例如
if(true){
var a=123;
}
如果是其他语言,如java,c#变量a只在if块级作用域有效;
但在js中并没有这样的块级作用域;会被预处理为
var a;
if(true){
a=123;
}