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