看着從Mozilla的JavaScript的指南這些文章:Mozilla狀態表達式也是語句。爲什麼?
表情也被認爲是賦值語句。事實上,在第二篇文章中,人們可以閱讀「任何表達也是一種陳述」。熟悉其他編程語言,我認爲表達式總是有價值的,但它們從不會導致像語句那樣的副作用。換句話說,7,7 + 8,「string」等是表達式,因爲它們不會改變狀態,但a = 7是一個語句,因爲現在已經定義了一個變量(即狀態已經改變)。
爲什麼Mozilla不區分JS中的兩個?
看着從Mozilla的JavaScript的指南這些文章:Mozilla狀態表達式也是語句。爲什麼?
表情也被認爲是賦值語句。事實上,在第二篇文章中,人們可以閱讀「任何表達也是一種陳述」。熟悉其他編程語言,我認爲表達式總是有價值的,但它們從不會導致像語句那樣的副作用。換句話說,7,7 + 8,「string」等是表達式,因爲它們不會改變狀態,但a = 7是一個語句,因爲現在已經定義了一個變量(即狀態已經改變)。
爲什麼Mozilla不區分JS中的兩個?
我相信你從字面上理解術語「表達」和「陳述」。 「不改變任何狀態的表達式」對編程語言來說是一個非常艱難的要求。
一個思想實驗:在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),因此任何表情(但仍然是一個語句)。
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表達式中構成所有語句的子集。
請解釋_什麼聲明比表達式不是._順便說一句,你的第二個例子返回'SyntaxError:Illegal return statement'。 – vantage5353
表達式是返回一些值,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等等。他們不返回任何值,但他們控制程序執行流程。
請定義你的意思是「狀態改變」,因爲我理解它的方式,你的第一個例子調用一個函數,這是一個包含兩個語句塊(assign&return)的函數。即該電話是一系列的陳述。該代碼會生成一個值,但它也會增加globalVar。您的解釋將語句描述爲不返回值的所有內容,但Mozilla聲明**表達式也是語句**。請解釋這個矛盾。 – vantage5353
這個矛盾源於我不精確的措辭,抱歉。最後一句讀起來像** iff **,實際上我的意思是**,如果** :)我重新編寫了它並且還添加了一些其他的想法。 –
我想這個問題就變成了爲什麼賦值語句像'var a = 1;'返回值?難道他們不是簡單地將名稱指向值? – vantage5353