关于变量提升优先级

138 阅读1分钟

今天试着看了一下前端基础题,发现一个之前没注意过的点--变量提升的优先级

这道题让我非常深刻的体会到了变量的提升,按照我一开始的思路来说我认为会直接输出er,但事实上在自执行函数中定义了一个变量,这个变量会被提升到作用域顶部,也就是var name===undefined;所以最终输出结果是‘chen’,但是如果把函数里的变量声明去掉,还是会输出‘er’。

(function(){
	if(typeof name==='undefined'){
		var name='chen';  // 变量name会提升到当前作用域顶部
		console.log(name);
	}else{
		console.log(name);
	}
})();
接下来这个代码更有意思,一开始我是把这段代码的var改写成了let,结果会报错,告诉我a已经定义过了,当我用var的时候,就能正常输出,我搜索后发现:var声明的变量有变量提升特性,let则没有这个特性。此外var可以允许重复声明相同的变量,后者会覆盖前者,let则不能重复声明的变量。
var c;
function c(a) {
    console.log(a);
    var a = 3;
    function a(){
    }
}
c(2);

所以这道题最终的输出结果就是:

image.png c的函数声明提到了最前面,所以c是函数,a同理。但是如果把输出语句放到声明后,就会按照顺序,输出a=3 变量提升也有优先级, 函数声明 > arguments > 变量声明