JavaScript
中同一个作用域内的变量都属于这个区域,在别的作用域是获取不到这个变量的。变量提升
。四
个方面即可。JavaScript
是单线程的语言,一个任务结束才会进行下一个任务,这样大家都默认认为执行会从上到下一条一条代码去执行,这句话是对的但又不完全对,有一种情况会有特殊。console.log(text);
text
它是会报错的,这是我们都知道的,如果是这样呢?console.log(text);
var text=828;
text
是在打印后声明的,所以他还是会报错,但实际上他没有报错,打印了一个undefined
。text=828;
var text;
console.log(text);
text
之后没有赋值,所以他会打印一个undefined
,但实际上真正的打印结果是828
,这又是为什么呢?var text=828;
的时候如果我们不了解变量提升肯定会认为他只是简简单单将828
赋值给了text
这一个声明,但实际上JavaScript
做了两步操作,分别是var text
声明,然后是text =828
赋值。JavaScript
编译时会有两个阶段分别是编译阶段
和执行阶段
,而「编译阶段」其中有做的处理是先找到同一个作用域中所有需要声明的变量,先将其声明(例如:var text
)然后才到代码的「执行阶段」等待执行(例如:text =828
)。var text=828
会将他分成两步操作的原因,说白了就是「变量和函数的所有声明都会在被执行前处理」。提升
,我们再看回之前那个面试题。text=828;
var text;
console.log(text);
var text;
text=828;
console.log(text);
var
声明的变量都会提前,而赋值等操作都会停留在原地,这就是我们所说的「变量提升」。addIce();
function addIce(){
console.log('加冰块');
}
addIce()
之前并没有声明该函数却不会报错呢?这是因为「函数声明也有提升」,它可以被理解为以下的形式:function addIce(){
console.log('加冰块');
}
addIce();
addIce();
var addIce=function(){
console.log('加冰块');
}
addIce is not a function
var addIce
会被提升到最上面,他可以被理解为以下的形式:var addIce;
addIce();
addIce=function(){
console.log('加冰块');
}
addIce
被赋值前就被使用了理所当然是会报错的。addIce();
console.log(addIce);
var addIce;
function addIce(){
console.log('加冰块');
}
addIce()
和加冰块
,以上的代码可以理解为以下的形式:function addIce(){
console.log('加冰块');
}
addIce();
console.log(addIce);
addIce
后,var addIce
直接就会被忽略了,虽然函数声明和变量声明都会提升,但是是「函数会首先提升然后才到变量」,虽然这种情况在日常中基本上不会出现也最好不要出现,但是还是得了解一下。由于「提升」这种情况,意味着在同一个作用域中无论是变量声明还是函数声明在什么地方都会在代码被执行前先处理,也就是所谓的「变量提升」和「函数提升」,在两者都存在时会「优先提升函数声明」。
更加值得一提的是在变量提升中,由于let const的出现,这两个声明的变量都不会变量提升,只有var会。
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8