歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

深入探究JavaScript的 {} 語句塊

今日學習解析json字符串,用到了一個eval()方法,解析字符串的時候為什麼需要加上括號呢?摸不著頭腦。原來javascript中{}語句塊具有二義性,不加括號會出錯,理解這種二義性對我們理解javascript代碼有極大幫助。

一、{}語句塊的兩個含義
1.表示語句塊
a. 在javascript中可以使用{}來括起代碼,在編輯器中方便管理代碼。因為javascript並沒有塊級作用域,所以這種寫法是無害的。
{
//some code...
}

b. 在javascript中 ,條件判斷語句,循環語句,函數都需要{}語句塊來整合代碼


2.對象字面量

var box = {
    name:'kuoaho',
    age:21 
}
//此時{code}作為表達式,可以賦值給一個變量
//其實對象字面量就是可以生成對象值的表達式

二、那如果對象字面量不作為一個賦值表達式,會發生什麼情況呢?
example:
    {name:'kuoao'}        //沒有報錯,但是也沒有創建對象
    {name:'kuohao',age}  //報錯

由上面可以看出對象字面量只能夠作為表達式賦值,第一種寫法沒有錯,只是javascript將它作為一個label語句解析了。
analysis:
    {name:'kuoao'}

      //{}一個語句塊
      // name:'kuohao',一個label語句,用於標記for循環

三、但是問題又來了……
{
name:'kuohao',
age:21
}
//這樣為什麼會報錯?這不是對象字面量的寫法嗎?

因為javascript中{}的二義性,{}不僅僅被認為是對象字面量而且還會被認為是代碼塊。
analysis:
    {
    name:'kuohao',
    age:21
    }
       

一個代碼塊,兩條label語句,如果沒有逗號,是完全沒有問題的,所以關鍵在於逗號,兩條語句的分隔應該使用分號,所以javascript會判定這是語法錯誤

四、正確的寫法
({
    name:'kuohao',
    age:21
    })

    //正確的寫法

()會把語句轉換成表達式,稱為語句表達式,對象字面量不是表達式嗎?為什麼還需要()來轉換?

加上括號以後,就可以消除這種二義性,因為括號裡的代碼都會被轉換為表達式求值並且返回,因此語句塊也就變成了對象字面量,也可以得出,對象字面量必須作為表達式而存在

Copyright © Linux教程網 All Rights Reserved