变量提升:
变量提升,是指在 JavaScript 代码执行过程中,JavaScript 引擎把变量的声明部分和函数的声明部分提升到代码开头的“行为”。变量被提升后,会给变量设置默认值undefined。
变量提升带来的问题:
- 变量覆盖
var myname = "极客时间"
function showName(){
console.log(myname);
if(0){
var myname = "极客邦"
}
console.log(myname);//undefined
}
showName()
- 本应销毁的变量没有被销毁(变量污染)
function foo(){
for (var i = 0; i < 7; i++) {
}
console.log(i); //7
}
foo()
JavaScript 引擎是如何同时支持变量提升和块级作用域的:
(let、const)块级作用域是通过词法环境的栈结构来实现的,而变量提升是通过变量环境来实现。
var let const 区别:
①var声明的范围是函数作用域(即包含var的函数的局部变量),let和const都是块作用域
②var声明的变量会自动提升到包含它的函数顶部,但是赋值不会提升,所以打印的话会显示undefined。let声明的变量不会在作用域中被提升。暂时性死区:在区块内,let声明此变量之前,该变量虽已存在但都不可用。
③var可以重复声明,let不允许重复声明。
const与let行为基本相同,唯一重要区别是在声明同时必须初始化,且值不可改变。