JS变量提升

图片描述

有哪位大神知道为什么最后一个console.log会报错
我自己尝试了debugger
发现if语句进不去,a是等于1的

阅读 2.6k
6 个回答

a++后自增,先参与运算,然后在自身加1.

你把var a=0 改成 var a=1试一试。

新手上路,请多包涵

因为if (a++) {}的时候a还是0,所以直接执行下面的console.log(a())

这个题目典型的考察js变量提升,注意,js变量提升只是大家常见的说法,严谨的说这种类型的题还是考察js的底层执行过程,就是js代码是如何被解释、编译(可能有人会说:fuck,js会编译?开什么玩笑...,我呵呵...)、执行一整套完整流程,现在我们就按照变量提升的说法来解释

这里特别说明,楼主的测试应该是在chrome中进行的,你在ie中试试,第一个console.log应该是打印一个函数,ie和标准浏览器对if这种条件的变量、函数预解析方式不一样

可以查看资料:https://segmentfault.com/a/11...

这里有两个坑:
一、在变量提升过程中有这样的顺序,函数形参 > 函数 > 变量,另外,赋值操作会覆盖声明过程。
针对这题相当于:

function a(){}
var a;
a = 0;// 这里的赋值操作会覆盖前面声明的function a,
....

二、js 引擎编译过程的差异
代码:

console.log(a);
var a = 0;
console.log(a);
if (a++) {
    function a() {console.log('function a')};
}
console.log(a());
  • chrome v8会在编译对不执行代码(dead code)(这里时条件为false)进行优化,我的理解是这里function a(){} 这段被去除。所以这里function a 在执行时就不存在提升了。
undefined
0
// 报错
  • IE Chakra(我在IE11进行了测试) 会把function a(){} 编译进去,就是和我们预期的函数、变量提升相同。
function a() {console.log('function a')};
0
// 报错
推荐问题
宣传栏