今天试着看了一下前端基础题,发现一个之前没注意过的点--变量提升的优先级
这道题让我非常深刻的体会到了变量的提升,按照我一开始的思路来说我认为会直接输出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);
所以这道题最终的输出结果就是:
c的函数声明提到了最前面,所以c是函数,a同理。但是如果把输出语句放到声明后,就会按照顺序,输出a=3
变量提升也有优先级, 函数声明 > arguments > 变量声明