JS学习重点-----预解析
JS预解析
- JS解析器在运行JS代码时分两步: 预解析和代码执行
预解析 - JS引擎会把JS里面所有 var 和 function 提升到当前作用域的最前面 代码执行时, 按照代码书写的顺序从上往下执行
- 预解析分为变量预解析(变量提升) 和 函数预解析(函数提升)
例子1:
//1.输出结果--undefined
var num = 10;
fun();
function fun() {
console.log(num);
var num = 20;
}
//相当于执行了以下操作()
var num; //提升num = 10那个 num
function fun() {
var num; //提升的是num = 20那个 num
console.log(num);
num = 20;
}
num = 10;
fun();
例子2:
//2.输出结果--undefined, 20
var num = 10;
function fn() {
console.log(num);
var num = 20;
console.log(num);
}
fn();
//相当于以下代码
var num; //提升num = 10的 num
function fn() {
var num; //提升num = 20的 num
console.log(num);
num = 20;
console.log(num);
}
num = 10;
fn();
例子3:
//3.输出结果--undefined, 9;
var a = 18;
f1();
function f1() {
var b = 9;
console.log(a);
console.log(b);
var a = '123';
}
//相当于以下代码
var a;
function f1() {
var b;
var a; //此时a = undefined, 就近原则, 待会儿log(a)取此值
b = 9; //b赋值为9
console.log(a);
console.log(b);
a = '123';
}
a = 18;
f1();
例子4:
//4.(典中典)以下代码
function f1() {
//相当于 var = 9; b = 9; c = 9; b 和 c 直接赋值 没有var声明, 当 全局变量 看
//集体声明 var a = 9, b = 9, c = 9
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
f1();
console.log(c); //全局变量c = 9
console.log(b); //全局变量b = 9
console.log(a); //局部变量a, 函数外不能使用