深入理解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);