1、js引擎运行js分为两步:
预解析代码执行
(1). 预解析js引擎会把js里面所有的var 还有function 提升到当前作用域的最前面
(2).代码执行按照代码书写的顺序从 上往下执行
2、预解析分为变量预解析(变量提升) 和函数预解析(函数提升)
(1) 变量提升就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
(2)函数提升就是把所有的函数声明提升到当前作用域的最前面 不调用函数
1.预解析
JavaScript代码由浏览器中的JavaScript解析器来执行的。JavaScript 解析器在运行JavaScript代码的时候
分为两步:预解析和代码执行。
几个小问题
1、
// 1问
console. log(num);
此时会输出 num is not defined (因为num没被定义)
2、坑1
// 2问
console.log(num); // undefined 坑1
var num = 10;
此时会输出 undefined
因为 变量提升,但不提升赋值操作 ,所以相当于
var num;
console.log(num);
num=10;
只定义为赋值,则为 undefined
3、
// 3问
fn();
function fn() {
console.log(11);
}
因为预解析函数提升到当前作用域最前面,所以相当于
function fn() {
console.log(11);
}
fn();
4、坑2
// 4问
fun();
var fun = function() {
console.log(22); //坑2
}
因为函数为函数表达式定义法,所以相当于
var fun;
fun();
fun=function(){
console.log(22);
}
将变量提升到当前作用域最前面,因为此时仅声明变量,fun并不是为一个函数,此时调用fun()函数就会报错(fun is not a function)
面试例题(重要):
//案例4:结果是几?
//案例4
f1();
console. log(c) ;
console. log(b) ;
console. log(a) ;
function f1() {
var a=b=c=9;
console.log(a) ;
console.log(b) ;
console.log(c) ;
}
根据预解析,相当于
function f1() {
var a=9;
b=9;
c=9;
console.log(a) ;
console.log(b) ;
console.log(c) ;
}
f1();
console. log(c) ;
console. log(b) ;
console. log(a) ;
函数f1被提升到最前面 ,因为定义变量时应该以逗号(,)分隔,但此题(var a=b=c=9)未以逗号分隔 ,所以相当于 var a=9; b=9; c=9; 因为在函数内部,变量未声明直接赋值是 全局变量
所以此处b,c为全局变量 ,则结果为
9,9,9,9,9,a is not defined (未声明 报错)
案例2:
var num=10;
fun();
function fun(){
console.log(num);
var num=20;
}
由于就近原则,变量提升,代码相当于
var num=10;
fun();
function fun(){
var num;
console.log(num);
num=20;
}
在函数内 num 声明未赋值,因此结果为 undefined