深入理解JS预解析(变量提升和函数提升)

2024-01-17 18:21:51

预解析

在执行代码之前,会首先进行预解析,那什么是预解析呢?

预解析是指JavaScript代码执行之前,会首先将var声明的变量和function声明的函数(这里指函数声明而不是函数表达式)提前到当前作用域的最顶端,也即我们常常提到的变量提升和函数提升。

变量提升

变量预解析也被称为变量提升,JavaScript代码执行之前,会首先将var声明的变量提升到当前作用域的最顶端。

需要注意的是:变量提升只会提升变量名的声明,而不会提升变量的赋值初始化。

例如:

console.log(abc); // 不会报错,打印出undefined
var abc = 123;

预解析后:

var abc;
console.log(abc);
abc = 123;

函数提升

函数预解析也叫函数提升,是指函数的声明会被提升到当前作用域的最顶端,但是不会调用函数。

需要注意的是:函数表达式不会函数提升。

例如:

fn(); // 不会报错,打印出abc
function fn() {
    console.log("abc");
}

预解析后:

function fn() {
    console.log("abc");
}
fn();

如果是函数表达式时:

fn(); // 会报错,fn此时不是一个函数
var fn = funciton() {
    console.log("abc");
}

预解析后:

var fn;
fn();
fn = function() {
    console.log("abc");
}

变量提升和函数提升的优先

函数提升优先级高于变量提升,且不会被同名变量声明时覆盖,但是会被同名变量赋值后覆盖

这一条,对于相同名称变量名和函数名非常有用。

console.log(fn); // f fn() {}
function fn() {
    console.log("abc");
}
var fn = "123";
console.log(fn); // "123"

预解析后:

function fn() {
    console.log("abc");
}
var fn;
console.log(fn);
fn = "123";
console.log(fn);

目录

相关推荐
display为inline-block的元素中间有间隙的原因和解决办法面试题:new关键字做了什么面试题:this指向引用计数算法闭包