JavaScript为什么要变量提升,导致了什么问题

320 阅读1分钟

造成变量声明提升的本质原因是 js 引擎在代码执行前有一个解析的过程,创建了执行上下文,初始化了一些代码执行时需要用到的对象。当访问一

个变量时,会到当前执行上下文中的作用域链中去查找,而作用域链的首端指向的是当前执行上下文的变量对象,这个变量对象是执行上下文的一

个属性,它包含了函数的形参、所有的函数和变量声明,这个对象的是在代码解析的时候创建的。



首先要知道,JS在拿到一个变量或者一个函数的时候,会有两步操作,即解析和执行。

1.解析和预编译过程中的声明提升可以提高性能,让函数可以在执行时预先为变量分配栈空间

2.声明提升还可以提高JS代码的容错性,使一些不规范的代码也可以正常执行

var tmp = 'hello world';

for (var i = 0; i < tmp.length; i++) {

console.log(tmp[i]);

}

console.log(i); // 11

由于遍历时定义的i会变量提升成为一个全局变量,在函数结束之后不会被销毁,所以打印出来11。