[英]Why is a semicolon required at end of line?
為什么這樣做:
a = []
a.push(['test']);
(function() {alert('poop')})()
但這給出了錯誤“數字不是函數”:
a = []
a.push(['test'])
(function() {alert('poop')})()
唯一的區別是第2行末尾的分號。我已經寫了很長時間的JavaScript了。 我知道自動分號插入,但我無法弄清楚會導致此錯誤的原因。
看看這個鏈式函數調用的例子。
a.push(['test'])(function() {alert('poop')})()
看起來熟悉? 這就是編譯器/解釋器查看代碼的方式。
詳情
這是用於描述調用表達式的語法的一部分。
CallExpression : MemberExpression Arguments CallExpression Arguments CallExpression [ Expression ] CallExpression . IdentifierName
基本上每個組(...)被視為原始MemberExpression a.push
參數 。
a.push (['test']) // MemberExpression Arguments
(function() {alert('poop')}) // Arguments
() // Arguments
或者更正式
CallExpression( CallExpression( CallExpression( MemberExpression( a.push ), Arguments( (['test']) ) ), Arguments( (function() {alert('poop')}) ) ), Arguments( () ) )
我不是Javascript專家(甚至是新手:),但是如果你將第二行和第三行結合起來,它仍然看起來語法上有效:
a.push(['test'])(function() {alert('poop')})()
那是試圖將a.push(['test'])
作為一個函數處理,將函數傳遞給它...然后將結果作為函數調用。
我懷疑如果兩個語句可以在語法上合並為一個語句,則需要使用分號,但這不是你想要的。
因為
a.push(['test'])(function() {alert('poop')})()
是一個有效的JavaScript表達式。 如果某些相鄰的行可以粘在一起形成一個有效的JavaScript表達式,那么您的JavaScript引擎會將它們粘在一起。
雖然它是一個有效的JavaScript表達式, a.push
返回一個不是函數的數字,當你嘗試調用一個不是函數的東西時,它會返回你看到的錯誤。
a.push(['test'])
將返回數組的長度,一個數字。 如果沒有分號,編譯器將解釋自調用函數的開括號,就像您嘗試將該數字作為帶參數的函數執行一樣。 假設它返回的長度為7,那么基本上這里發生的事情就像你寫的那樣:
7 (function() {alert('poop')})();
因此錯誤“數字不是函數”,因為它不知道如何調用7作為函數。
有些情況下,不需要空格作為令牌分隔符,但僅用於提高可讀性:
空格字符用於提高源文本可讀性並將標記(不可分割的詞匯單元)彼此分開,但在其他方面無關緊要。 任何兩個令牌之間可能會出現空白區域,但不能出現在任何其他類型的令牌中。
在這種情況下, a.push(['test'])
和(function() {alert('poop')})()
之間的a.push(['test'])
不適用於令牌分隔符,因此無關緊要。 所以它等同於:
a.push(['test'])(function() {alert('poop')})()
並且由於a
引用空數組與長度為0,調用a.push(['test'])
附加一個元件到a
,並返回更新后的值a.length
,即1
:
1(function() {alert('poop')})()
剩下的就是歷史。
a.push(['test'])
返回一個數字。
然后,您嘗試將該數字作為函數調用, function() {alert('poop')}
作為唯一參數。
因此你的錯誤, number is not a function
。
a.push()的結果是返回數組的大小,在本例中為1.圍繞函數的括號使得Javascript解析器認為您正在嘗試調用:
1( function() {alert('poop')} )()
或者您嘗試使用匿名函數作為參數調用名為1
的函數,然后將return作為函數執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.