JavaScript中的预解析

预解析

在当前的作用域中,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);

猜你喜欢

转载自blog.csdn.net/KysonLai/article/details/81122695