1.js代码是由浏览器中的js解释器来执行的,js解析器在运行js代码时分为两步:预解析和代码执行
(a)预解析:就是js引擎会将js里面所有的 var 、function 提升到当前作用域的最前面。
(b)代码执行:代码按照顺序来执行
2.预解析又分为:变量预解析(变量提升)和 函数预解析(函数提升)
(a)变量提升:将所有的变量声明提升到当前的作用域最前面,不提升赋值操作。
(b)函数提升:将所有的函数声明提升到当前作用域的最前面 ,不调用函数
具体案例如下,可能看完上面的定义仍一头雾水,但看完下面的案例你会恍然大悟。
<script>
console.log(a); //结果为:undefined
var a=10;
// 相当于执行了以下代码:
var a;
console.log(a); //a没有赋值,所以结果为undefined
a=10;
b();
function b(){
console.log('今天天气真不错');
}
// 相当于执行了以下代码
function b(){
console.log('今天天气真不错');
}
b(); //所以能正确打印
c(); //报错
var c=function(){
console.log('早上好');
}
//相当于执行了以下代码:
var c;
c();//该方法未定义
c=function(){
console.log('早上好');
}
var foo = function(x,y){
return x-y;
};
function foo(x,y){
return x+y;
}
var num = foo(1,2);
console.log(num); 结果为:-1
// 该代码相当于执行了以下操作
// var foo;
// function foo(x,y){
// return x+y;
// }
// var num;
// foo = function(x,y){
// return x-y;
// };
// num = foo(1,2);
// console.log(num);
</script>
易踩的坑
var a=b=c=9 相当于var a=9;b=9;c=9,只有a被声明了var。
<script>
f1();
console.log(c);
console.log(b);
console.log(a);
function f1(){
var a=b=c=9; //相当于 var a=9;b=9;c=9
console.log(a);
console.log(b);
console.log(c);
}
// 以上代码相当于执行了以下代码
function f1(){
var a;
a=b=c=9; // b,c 是全局变量
console.log(a);
console.log(b);
console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(a);
</script>