2013-08-20 13 views
2

看着從Mozilla的JavaScript的指南這些文章:Mozilla狀態表達式也是語句。爲什麼?

Expressions

Statements

表情也被認爲是賦值語句。事實上,在第二篇文章中,人們可以閱讀「任何表達也是一種陳述」。熟悉其他編程語言,我認爲表達式總是有價值的,但它們從不會導致像語句那樣的副作用。換句話說,7,7 + 8,「string」等是表達式,因爲它們不會改變狀態,但a = 7是一個語句,因爲現在已經定義了一個變量(即狀態已經改變)。

爲什麼Mozilla不區分JS中的兩個?

回答

5

我相信你從字面上理解術語「表達」和「陳述」。 「不改變任何狀態的表達式」對編程語言來說是一個非常艱難的要求。

一個思想實驗:在7 + 8替代8用一個函數調用

var globalVar = 0; 
function my8() { 
    globalVar = globalVar + 1; 
    return 8; 
} 

7 + my8()聲明或體現在哪裏?這裏沒有明顯的狀態變化,但仍然my8執行狀態變化。使用「無副作用」定義,不可能決定7 + my8()是否是一個語句或表達式,而不分析my8函數的代碼。當然,可以簡單地禁止任何狀態改變作爲函數調用的一部分,但這不是JavaScript的方式。

根據我的經驗,大多數語言將「所有返回值的東西」定義爲表達式和語句,其他所有內容都只是一個語句。

要回答你的問題「爲什麼Mozilla的不是JS兩者之間區別?」:

我認爲他們這樣做,但不是你所期望的方式。要考慮「所有返回價值的東西」,表達式似乎是最實際的方法。

此外,在一段代碼中同時存在一個語句和一個表達式並不矛盾。這就是Javascript和許多其他語言的工作原理。當然總是可以在這兩者之間畫一條更嚴格的界限。

例子:

分配返回值,所以這是可能的:

a = b = c = 1; 

可以寫在較爲明顯的形式:

a = (b = (c = 1)); 

因爲工作分配的被認爲是一種表達(也是一種說法)。

在另一方面:

if (true) { }; 

沒有返回值(!在Javascript),因此任何表情(但仍然是一個語句)。

+0

請定義你的意思是「狀態改變」,因爲我理解它的方式,你的第一個例子調用一個函數,這是一個包含兩個語句塊(assign&return)的函數。即該電話是一系列的陳述。該代碼會生成一個值,但它也會增加globalVar。您的解釋將語句描述爲不返回值的所有內容,但Mozilla聲明**表達式也是語句**。請解釋這個矛盾。 – vantage5353

+0

這個矛盾源於我不精確的措辭,抱歉。最後一句讀起來像** iff **,實際上我的意思是**,如果** :)我重新編寫了它並且還添加了一些其他的想法。 –

+0

我想這個問題就變成了爲什麼賦值語句像'var a = 1;'返回值?難道他們不是簡單地將名稱指向值? – vantage5353

0

Mozilla確實區分了兩種語言,或者說JavaScript語法。

唯一略顯「特殊」關於JavaScript如下:

「任何表情也聲明」

這意味着在其中的語法需要聲明的地方,一個表達式可以直接使用(但不是相反)。例如。以下是有效的JavaScript,但在許多其他類似的語言無效:

if (true) "asfd" 

foo = function(){ 
    if (5) { 
    "some text here that won't do anything"; 
    return true; 
    42; // always good to have that one here! 
    } 
} 

而陳述不能作爲表達式:

a = (if (true) 5) // does not work "unexpected token 'if'" 

他們使用的「功能」爲沒有引入新的關鍵字或語法的嚴格模式規範 - 如果添加表達式"use strict"作爲函數體中的第一個語句,JavaScript在支持瀏覽器的嚴格模式下執行。

雖然表達式評估爲值,但通常語句不會。大多數語句都會改變控制流,表達式通常不會(儘管人們可能會說導致拋出異常的表達式也會改變控制流)。 在Javascript表達式中構成所有語句的子集。

+0

請解釋_什麼聲明比表達式不是._順便說一句,你的第二個例子返回'SyntaxError:Illegal return statement'。 – vantage5353

1

表達式是返回一些值,Expression (Computer Science)一個代碼段:

3; // 3 
{}; // Object 
func(); // whatever func returns, or undefined if not specified 

可以結合使用表達式成一個複合表達式:

3 + 7; // 10 
{}, []; // Array. Comma operator always returns result of right-most expression 

語句是最小的有效代碼片段可編譯或解釋,Statement (Computer Science)

5; // valid js 

您還可以組合語句轉換爲複合語句:

check || func(); // valid js 
{ 
    4 + 9; 
    "block statement"; 
} 

在Mozilla文檔中,聲明指的是顯式或隱式地通過分號結束的任何(化合物)語句(;)。

[,,[],[,[,,],,]]; // Array declaration whose reference is returned (and ignored) 
// Multi-dimensional array with empty (undefined) elements 

在一些編程語言中,上面的例子沒有編譯或者沒有被解釋。其他語言可能不允許捕捉表達式的結果。

Javascript is very expressive,這就是爲什麼每個表達式計爲有效語句。有些語句不是表達式,比如break,return,while等等。他們不返回任何值,但他們控制程序執行流程

相關問題