1

好久不写博客了,主要因为忙于找实习,以及沉迷看书。其实如果时间不忙,有好多技术博客想分享。

问题

可以试着执行如下语句:

var a = 1;
++a++;   //ReferenceError

没错,会报错。请允许我先写两个简单的知识点,再写具体原因。

优先级

后置++的优先级大于前置++优先级,这就是语法规则。

语句返回值

在浏览器内直接写代码,每条语句之后都会有返回值,如下:

clipboard.png

关于为什么var语句都有返回值,其实JavaScript里面每条语句都有返回值,你只是没有在意。我觉得,只要知道每条语句都是有返回值的就足够了。另外规范中定义,a = b这种赋值语句,返回值是后者,我以前的文章中,在文章最后有证明的代码。

原因

好了,赶紧说原因。
优先级,后置++高,先执行a++,你也看到了上面的图片,a++会返回一个数,就是1。
那么之后就是执行++1,这就是报错的根本原因。
当你尝试引用一个未被定义的变量时,将会抛出一个 ReferenceError 。
++1执行时,会把1看成是一个变量,自然1没被声明过,而且1根本就是一个数值类型数据,根本不是变量,因此报错。

大一时候,学C语言,b = a++ ;是怎么执行的呢?
我的C语言老师说,先执行b = a ; 然后a++;
坑啊!真的坑啊!
其实,b = a++;就是先执行a++,此时就是a已经加上一了,只不过为什么赋值后,b的值仍旧是之前未加一的a,是因为a++的返回值就是之前的a。
因此,a++就是一步执行完的,绝不是先b等于之前的a。
我在Java下测试过,这个报错原因也是可以用上面这个原因分析的。


你才到碗里去
40 声望1 粉丝

多看书就对了。