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代码的容错性,使一些不规范的代码也可以正常执行