2016-09-17 93 views
1

以下代碼段拋出在線路意外的標記:B:功能(FUNC,DATA1) https://jsbin.com/qobicahica/edit?html,js,output爲什麼這段代碼會拋出意外的令牌?

var Funcb = (function() 
{ 
return 
{ 
    b: function (func, data1) 
    { 
     alert(1); 
    } 
}; 
    })(); 

Funcb.b(1,1); 

但是,在下面的教程工作的類似的例子:

https://toddmotto.com/everything-you-wanted-to-know-about-javascript-scope/

// define module 
    var Module = (function() { 
    return { 
    myMethod: function() { 
     console.log('myMethod has been called.'); 
    } 
    }; 
})(); 

// call module + methods 
Module.myMethod(); 

編輯: 返回後刪除換行符後的作品,但爲什麼? JavaScript時是如此的寬容和鬆散類型,然後這是爲什麼不忽略

var Funcb = (function() 
    { 
    return{ 
     b: function (func, data1) 
     { 
      alert(1); 
     } 
    }; 
     })(); 
+0

https://jsfiddle.net/L01k684r/ – guest271314

回答

2

問題出在第三行,在返回語句之後插入了分號。請參閱rules for JS automatic semicolon insertion

刪除return後的換行符,它應該可以工作。

var Funcb = (function() { 
    return { 
     b: function (func, data1) { 
      alert(1); 
     } 
    }; 
})(); 

Funcb.b(1,1); 

要回答你的編輯,看到specs第28頁。

return 
a+b 

由自動分號插入變形爲以下:

return; 
a+b; 

表達式a + b爲不被視爲由 返回被返回的值聲明,因爲一個LineTerminator將它從 令牌返回中分離出來。

1

你return語句應該包含這樣的。大括號位於下一行,應位於return語句旁邊。這是給出意想不到的令牌錯誤。

var Funcb = (function() { 
    return { 
     b: function (func, data1) { 
      alert(1); 
     } 
    }; 
})(); 
Funcb.b(1,1); 
+0

感謝您的檢查。發佈後發現,編輯該問題。當javascript如此寬容且鬆散地輸入時,爲什麼這不被忽略? – Stacky

+1

因爲在你的例子中函數返回null(一個空的return語句),然後解析器試圖評估未分配的{b:func ..}對象。 –

相關問題