表達方式
表達式產生一個值,并且可以在需要該值的任何地方編寫該表達式,例如,將其作為函數調用中的參數或賦值的右側。以下各行包含一個表達式:
myvar
3 + x
myfunc('a', 'b')
陳述
大致上,一條語句執行一個動作。循環和if語句是語句的示例。程序基本上是一系列語句。[ 8 ]
無論JavaScript希望在哪里聲明,您都可以編寫表達式。這樣的語句稱為表達式語句。相反的情況并不成立:您無法在JavaScript需要表達式的地方編寫語句。例如,一條if語句不能成為函數的參數。
條件語句與條件表達式
區別 如果我們看一下兩個相似的語法類別的成員:if語句和條件運算符(一個表達式),則語句和表達式之間的關系會變得更加清晰。
以下是一個語句示例:if
var salutation;
if (male) {
? ? salutation = 'Mr.';
} else {
? ? salutation = 'Mrs.';
}
有類似的一種 表示條件運算符。前面的語句等效于以下代碼:
var salutation = (male ? 'Mr.' : 'Mrs.');
等號和分號之間的代碼是一個表達式。括號不是必需的,但是如果我將其放在括號中,我發現條件運算符更容易閱讀。
使用歧義表達式作為語句
二 各種表達形式看起來像語句,它們在句法類別方面是模棱兩可的:
對象文字(表達式)看起來像塊(語句):
{
? ? foo: bar(3, 5)
}
前面的構造可以是對象文字(詳細信息:Object Literals)或塊,后跟標簽foo:,后跟函數調用bar(3, 5)。
命名函數表達式類似于函數聲明(語句):
function foo() { }
前面的構造是命名函數表達式或函數聲明。前者產生一個函數,后者產生一個變量并為其分配一個函數(有關這兩種函數定義的詳細信息:定義函數)。
為了防止在解析過程中產生歧義,JavaScript不允許您將對象文字和函數表達式用作語句。也就是說,表達式語句不能以以下內容開頭:
大括號
關鍵字 function
如果表達式以這些標記中的任何一個開頭,則它只能出現在表達式上下文中。您可以通過例如在表達式兩邊加上括號來遵守該要求。接下來,我們將看兩個必要的示例。
通過eval()評估對象文字
eval 解析其參數 陳述語境。如果要eval返回對象,則必須在對象文字周圍加上括號:
> eval('{foo:123}')
123
> eval('({{foo:123})')
{foo:123}
立即調用函數表達式
下列代碼是立即調用的函數表達式(IIFE),該函數的主體會立即執行(您將了解IIFE在通過IIFE引入新作用域中的用途):
>(function(){return'abc'}())
'abc'
如果省略括號,則會出現語法錯誤,因為JavaScript會看到一個不能為匿名的函數聲明:
>函數(){返回'abc'}()
SyntaxError:函數語句需要一個名稱
如果添加名稱,還會收到語法錯誤,因為無法立即調用函數聲明:
>函數foo(){返回'abc'}()
SyntaxError:意外令牌)
函數聲明之后的內容必須是法律聲明,()而不是。