引子:表達式和語句很基礎,可是有時會犯錯,好比:git
function(){}//報錯 (function(){})//不報錯 function f(x){ return x + 1 }()//報錯 function f(x){ return x + 1 }(1)//不報錯,爲何返回 1
能明白爲何?github
解釋:express
第一行代碼:由於JavaScript 將 function 關鍵字看成一個 函數聲明語句 的開始,而函數聲明語句 function 關鍵字後面應該是 函數名,這裏後面跟圓括號,固然會報錯。數組
第二行代碼:給它加上一對圓括號,解析器會把()裏的當作表達式去解析,在這裏就會當作匿名函數表達式解析,因此不會報錯。函數
第三行代碼:在一條語句後面加上()會被當作分組操做符,分組操做符裏必需要有表達式,因此這裏報錯;spa
第四行代碼:在一條函數聲明語句後面加上(1),僅僅是至關於在聲明語句以後又跟了一條毫無關係的表達式,等價於下面代碼:設計
function f(x){ return x + 1 } (1)//1
因此返回了可有可無的答案;code
看來基礎仍是要看看的,下面甩定義:對象
表達式(expression):blog
js 中的一個短語,js 解釋器會將其計算出一個結果。程序中的常量是最簡單的一類表達式。
變量名也是一種簡單的表達式,它的值就是賦值給變量的值。
複雜表達式是由簡單表達式組成的。好比,數據訪問表達式是由一個表示數組的表達式、左方括號、一個整數表達式和右方括號構成。它們所組成的新的表達式的運算結果是該數組的特定位置的元素值。
一樣的,函數調用表達式由一個表示函數對象的表達式和0個或多個參數表達式構成。
將簡單表達式組合成複雜表達式最經常使用的方法就是使用運算符(opetator)。
運算符按照特定的運算規則對操做數(一般是兩個)進行運算,並計算出新值。
乘法運算符「*」是比較簡單的例子。表達式x*y是對兩個變量表達式x和y進行運算並得出結果。有時咱們更願意說運算符返回了一個值而不是「計算」出了一個值。
書上目錄截圖:
語句(statement):
js 整句或命令。js 語句是以分號結束;表達式計算出一個值,但語句用來自行以使某件事發生。
「使某件事發生」的一個方法是計算帶有反作用的表達式。諸如賦值和函數調用這些有反作用的表達式,是能夠做爲單獨的語句的,這種把表達式當作語句的用法也稱做表達式語句(expression statement)。相似的語句還有聲明語句(declaration statement),聲明語句用來聲明新變量或定義新函數。
書上目錄截圖:
參考資料: