浏览器引擎在解释JS代码之前,会对JS代码进行编译,其中一部分工作就是声明提升,也就是找到所有的声明,包括变量声明和函数声明都会被找到并在代码块执行前被处理。
比如var i = 0;这句话会被浏览器解读成var i和i = 0两句话执行。
其中var i会在编译阶段就会先执行,而i=0这段赋值代码会在原地等待执行。
那么函数声明的提升,包括函数的代码块都会被一起提升,所以咱们在调用函数的时候,函数声明已经被执行过了。
当函数声明和变量声明在一起时,函数声明提升在前,变量提升在后
严格来讲,let 也会提升,但由于“暂时性死区”(temporal dead zone),实际上不能在声明之前使用 let 变量。因此可以简单地记作 let 声明的变量不发生声明提升。
add(1, 2); // TypeError: add is not a function
var add = function(num1, num2) {
console.log(num1 + num2);
}; // 报错原因:add 被当作变量提升了,而非被当作函数提升。
-
let/const: 声明提升, 默认值是 undefined, 赋值之前
不能用
-- 处于***\*暂存死区\****
状态 -
let /const 声明的变量存储在 与 window 同级别的脚本区 ,没有全局污染
-
由于var在全局声明变量, 自定义的变量存储在window作用域中, 污染了系统提供的 window对象
-
同名会覆盖 window 中原有属性