### 不管条件是否成立都要进行变量提升
> 不管条件是否成立,判断体中出现的var/function都会进行变量提升;但是在最新浏览器版本当中,function声明的变量只能提前声明,不能定义了(前提:函数是在判断体重)。
```javascript
// 不管条件是否成立都要进行变量提升
console.log(num);//=>undefined
console.log(fn);//=>undefined
if (1 == 1) {
var num = 12;
function fn() {
???}
}
```
> 代码执行到条件判断地方
> [条件不成立]
> 进入不到判断体中,此时之前声明的变量或者函数依然是undefined
> [条件成立]
> 进入条件判断体中的第一件事情不是代码执行,而是把之前变量提升没有定义的函数首先定义了(进入到判断体中函数就定义了,迎合ES6中的块级作用域)。
```javascript
// 不管条件是否成立都要进行变量提升
console.log(num);//=>undefined
console.log(fn);//=>undefined
if (1 == 1) {
???console.log(num);//=>undefined
???console.log(fn);//=>函数本身---此处条件成立,先把变量提升没定义的函数首先定义了
???var num = 12;
???function fn() {
???}
???console.log(num);//=>12
???console.log(fn);//=>函数本身
}
```
> 老版本浏览器不是这样处理的:不管条件是否成立,都要进行变量提升(和新版本不一样的地方,新版本function只是声明,老版本function依然是声明+定义)
```javascript
//=>var function 没有提升变量
f = function () {
???return true;
}
g = function () {
???return false;
}
~function () {
???//=>[私有作用域]
???//变量提升:g=undefined新浏览器不管条件是否成立,都进行变量提升,只对函数进行声明
???//![]false ?[]==![]//=>true ?true&&true
???if (g() && [] == ![]) {//=> Uncaught TypeError: g is not a function
???????f = function () {//
???????????return false;
???????};
???????function g() {
???????????return true;
???????}
???}
}();
console.log(f());
console.log(g());
//新浏览器下 g is not a function
//老浏览器下 false false 273行的f是全局的,把全局修改为了false,276的g是私有作用域,跟全局没有影响,所以还是false
```
js不管条件是否成立都要进行变量提升
原文地址:https://www.cnblogs.com/kpengfang/p/9866266.html