2014-01-05 60 views
1
var calculator = function() 
{ 
    function abc() { return (2+3); } 

    return { 
     addFun: abc 
    } 
}(); 


var calcu = function() { 
    function abc() { return (3+4); } 

    return 
    { 
     addFun: abc 
    } 
}(); 


$(document).ready(function() { 
    alert(calculator.addFun()); 
    **alert(calcu.addFun());** 
}); 

計算器和計算器功能有什麼區別? calcu函數在執行時會出錯。帶「返回」關鍵字的大括號

區別只在於大括號是「calcu」中的下一行。如果我刪除下一個並使用「return」關鍵字放置大括號,那麼工作正常。

請解釋這是爲什麼?

+0

是的,分號插入在返回語句之後與其他地方不同... – dandavis

回答

5

它被解析爲這樣:

return; // returns undefined 
// a block: 
{ 
    addFun: abc // syntax error! 
}; 

因爲自動分號插入。

將其更改爲:

return { 
    addFun: abc 
}; 
+0

編輯太多!它將成爲一個社區wiki! – Cilan

+0

@Man編輯發佈後5分鐘不編輯:P – Doorknob

+1

Nitpick:錯誤出現是因爲undefined沒有名爲addFun的方法。沒有語法錯誤。 – Blender

1
return 
{ 
    addFun: abc 
} 

這是錯誤的,因爲JavaScript將執行的回報,並會全身而退。 這應該是

return { 
    addFun: abc 
} 
+0

@ Travesty3對不起復制粘貼錯誤;) –

+0

沒問題。但缺乏代碼風格讓你的答案出現錯誤。所以我想確保它在得到大量的降價前得到修復。 – Travesty3

2

返回是JavaScript中一個棘手的關鍵字。在第一個示例中,您將匿名對象返回給計算器函數,而在第二個示例中,您不返回任何值。 JavaScript的將解釋這樣的第二個功能:

var calcu = function() { 
    function abc() ... 

    return; // return undefined 
    { 
      addFun: abc 
    } 

公告半結腸return關鍵字後解釋,因此calcu函數將返回什麼。

+0

是的,在這種情況下,你周圍的東西會讓你解開猜測你的意圖錯誤的所有機會。我常常因爲我的返回值使用parens而受到批評,但在需要時就是這種情況。 – jfriend00

5

這就是所謂的automatic semicolon insertion

When a continue , break , return , or throw token is encountered and a LineTerminator is encountered before the next token, a semicolon is automatically inserted after the continue , break , return , or throw token.

因爲有一個新行權的return聲明後,分號自動插入,把你的代碼:

return; 
{ 
    addFun: abc 
} 
1

看一看這樣的掉毛工具作爲jshint爲了避免這個和許多其他錯誤,這裏是它的輸出:

enter image description here

會發生什麼情況是,這部分:

return 
{ 
    addFun: abc 
} 

被解釋爲兩個語句,一個返回空隙(該函數返回空隙immediatelly)加上包含未分配給任何addFun對象表達式。

相關問題