预解析
在当前的作用域中,js代码执行之前,浏览器首先会默认地把所有带var和function的关键字进行提前的声明或者定义
1.对于var,在预解析的时候只是提前地声明
console.log(a) //undefined
var a = 10;
console.log(a) //10
2.对于function,在预解析的时候提前声明+定义
fn(); //test
function fn () {
console.log('test')
}
3.预解析只发生在当前的作用域下,开始只对window下进行预解析,只有函数执行的时候才会对函数中的进行预解析
var m=0;
var n=1;
function fn(){
console.log(n);
console.log(m);
n=4;
var n=5;
console.log(n)
}
fn();
输出结果为:
undefined
0
5
开始只在window下进行预解析,得到var m, var n 和 fn
预解析完成,然后开始执行代码var m =0; var n = 1;fn();
执行fn()时,对其作用域进行预解析,得到var n
预解析完成,然后开始执行代码
console.log(n),在当前作用域中找到了n,但是未定义,所以输出undefined
console.log(m),在当前作用域中没找到m,于是往上一级作用域开始找,找到了m=0,所以输出0
n = 4; var n = 5; console.log(n),在当前作用域中找到n=5,所以输出5
4.不管条件是否成立,都会进行预解析
if (false) {
var num = 12;
}
console.log(num); //undefined
5.只预解析 “=” 左边的
fn(); //undefined
var fn = function () {
console.log('test')
}
6.return后面的代码依然会进行预解析;return返回的内容不进行预解析
function fn() {
console.log(num); //undefined
return function () {
};
var num = 100;
}
fn();
7.预解析时,遇到一个已经声明过的变量,不需要重新声明,但要重新赋值
fn(); //b
function fn() {
console.log("a");
}
fn(); //b
var fn = 10;
fn(); //Uncaught TypeError: fn is not a function,这里相当于10();
function fn() {
console.log("b");
}
fn(); //前面已报错,这里不执行
8.立即执行函数在全局作用域下不进行预解析,当代码执行到这个位置的时候定义和执行一起完成
(function(num){
console.log(num);
})(100);