为了账号安全,请及时绑定邮箱和手机立即绑定

JS变量提升

JS变量提升

拉风的咖菲猫 2019-03-20 15:11:50
有哪位大神知道为什么最后一个console.log会报错我自己尝试了debugger发现if语句进不去,a是等于1的
查看完整描述

6 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

a++ 是 0然后 a 是 1


查看完整回答
反对 回复 2019-04-08
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

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


查看完整回答
反对 回复 2019-04-08
?
慕容708150

TA贡献1831条经验 获得超4个赞

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


查看完整回答
反对 回复 2019-04-08
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

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


查看完整回答
反对 回复 2019-04-08
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

这里有两个坑:

一、在变量提升过程中有这样的顺序,函数形参 > 函数 > 变量,另外,赋值操作会覆盖声明过程。

针对这题相当于:


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

// 报错


查看完整回答
反对 回复 2019-04-08
  • 6 回答
  • 0 关注
  • 411 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信