js中的变量提升

文章类型:Javascript

发布者:admin

发布时间:2023-04-14

一:定义

属性被提到前面,默认undefined,函数中何处位置声明的变量,都被提升到了函数的首部,可以在变量声明前访问到而不会报错

二:原因

1:代码执行前有一个解析的过程,创建了执行上下文,初始化了一些代码执行时需要用到的对象。

2:当访问一个变量时,会到当前执行上下文中的作用域链中去查找,而作用域链的首端指向的是当前执行上下文的变量对象,这个变量对象是执行上下文的一个属性,它包含了函数的形参、所有的函数和变量声明,

三:优点

1:提高性能,会进行语法检查和预编译,只进行一次。因为变量(函数)的代码并不会改变,会为函数生成预编译代码。会统计声明了哪些变量、创建了哪些函数,并对函数的代码进行压缩,去除注释、不必要的空白等。

2:容错性更好,变量提升可以在一定程度上提高JS的容错性

a = 1;
var a;
console.log(a);

四:问题

1:导致变量的相互覆盖以至于作用域混乱

var tmp = new Date();

function fn(){
console.log(tmp);
if(false){
var tmp = 'hello world';
}
}

fn(); // undefined

2:容易导致内存泄漏

五:总结

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

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