聊一聊变量提升和函数提升
1.什么是提升?
在JavaScript代码执行前,js引擎会先进行预编译,预编译期间会将变量声明与函数声明提升至其对应作用域的最顶端。
2.什么是变量提升?
变量提升是指在js引擎对js代码进行预编译的时候对变量的声明进行提升,变量此时的值为undefined。
全局作用域中声明的变量会提升至全局最顶层,函数内声明的变量只会提升至该函数作用域最顶层。
console.log(a);
var a = "a";
var foo = () => {
console.log(a);
var a = "a1";
}
foo();
//上面这段代码的2个打印结果都是 undefined
//在预编译阶段进行了变量提升
//预编译阶段,代码变成了这样:
var a; //全局作用域
console.log(a); // undefined
a = "a";
var foo = () => {
//函数作用域
var a; // 全局变量会被局部作用域中的同名变量覆盖
console.log(a); // undefined
a = "a1";
}
foo();
3.什么是函数提升?
函数提升是指js引擎对js代码进行预编译的时候,把函数的声明部分提到了其作用域的顶部,那样就可以直接在函数声明之前调用该函数,并能成功执行它。
3.1 js里函数的写法有函数声明,函数表达式
//下面这个是函数声明
function foo1 () {
console.log("foo1");
};
//下面这个是函数表达式
var foo2 = function () {
console.log("foo2");
};
//以函数表达式的形式写的函数,效果和变量提升一样
var foo2;
foo2 = function () {
console.log("foo2");
};
3.2 函数提升举例:
console.log(foo1); // 打印的是函数的声明部分
foo1(); // 得到的是函数的执行结果:foo1
function foo1 () {
console.log("foo1");
};
4. 怎样才会变量提升、函数提升?
一般来说,使用var来声明变量和函数会发生变量提升。
ES6新增了let和const关键字,用let和const声明的变量和函数是不存在提升现象的
5. 在进入执行上下文时,首先会处理函数声明,其次会处理变量声明
参考文章:
[1]: js变量提升函数提升