1、js运行js代码的步骤
(1)预解析
- js引擎会把js中 所有的var 还有 function 提升到当前作用域的最前面
(2)代码执行
- 按照代码的书写顺序,从上至下依次执行
2、预解析的步骤
(1)变量提升
- 把所有的变量声明提升到当前的作用域最前面
- 不提升赋值操作
(2)函数提升
- 把所有的函数声明提升到当前的作用域最前面
- 不调用函数
3、举例(将以下代码转换为预解析后的顺序)
(1)代码
function f1() {
var a = b = c = 9;
// 相当于 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);
(2)预解析顺序的代码
function f1() {
var a;
a = b = c = 9;
// 相当于 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);
结果:
分析原因:
由于a的作用域是局部作用域,a的声明只在函数体内有效,所以最后打印a会报错,因为b和c没有用var修饰,所以是全局变量,因此a和b在函数外面打印是有值的。