很久不寫博客了,主要由於忙於找實習,以及沉迷看書。其實若是時間不忙,有好多技術博客想分享。segmentfault
能夠試着執行以下語句:瀏覽器
var a = 1; ++a++; //ReferenceError
沒錯,會報錯。請容許我先寫兩個簡單的知識點,再寫具體緣由。測試
後置++的優先級大於前置++優先級,這就是語法規則。spa
在瀏覽器內直接寫代碼,每條語句以後都會有返回值,以下:code
關於爲何var語句都有返回值,其實JavaScript裏面每條語句都有返回值,你只是沒有在乎。我以爲,只要知道每條語句都是有返回值的就足夠了。另外規範中定義,a = b這種賦值語句,返回值是後者,我之前的文章中,在文章最後有證實的代碼。圖片
好了,趕忙說緣由。
優先級,後置++高,先執行a++,你也看到了上面的圖片,a++會返回一個數,就是1。
那麼以後就是執行++1,這就是報錯的根本緣由。
當你嘗試引用一個未被定義的變量時,將會拋出一個 ReferenceError 。
++1執行時,會把1當作是一個變量,天然1沒被聲明過,並且1根本就是一個數值類型數據,根本不是變量,所以報錯。ip
大一時候,學C語言,b = a++ ;是怎麼執行的呢?
個人C語言老師說,先執行b = a ; 而後a++;
坑啊!真的坑啊!
其實,b = a++;就是先執行a++,此時就是a已經加上一了,只不過爲何賦值後,b的值仍舊是以前未加一的a,是由於a++的返回值就是以前的a。
所以,a++就是一步執行完的,毫不是先b等於以前的a。
我在Java下測試過,這個報錯緣由也是能夠用上面這個緣由分析的。get