簡體   English   中英

為什么在行尾需要分號?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM