這是一個自學成功的JS黑客,並且試圖做得更正式一些,因爲我必須構建一個更好的JS應用程序,這個應用程序是名稱間隔的,並且是一個更好的JS公民。我很感激我在這裏做錯了一些指示。意外的IIFE執行順序
這個想法是使用第一個閉包來構造一個名稱空間,然後在第二個我添加一個方法'類'構造函數的名稱空間對象。我在子上調用一個方法。
(function() {
'use strict';
/**
* @namespace ProjectX
*/
var ProjectX = {
attr1: 'I am inside ProjectX'
}
window.ProjectX = ProjectX;
})()
//console.log(ProjectX.attr1); // When this line is uncommented the code will output 'foobar' as expected?
(function() {
'use strict';
ProjectX.subObj = function(val) {
this.name = val;
return this;
};
})();
var subObj = new ProjectX.subObj('Foobar');
console.log(subObj.name);
我期待看到 'Foobar的' 在控制檯日誌。然而,這產生了在控制檯下面的結果:
{ "message": "Uncaught TypeError: (intermediate value)(intermediate value)(intermediate value)(...) is not a function", "filename": " http://stacksnippets.net/js ", "lineno": 03, "colno": 1 }
當我讀到這個代碼,我希望這兩個IIFE的將順序執行,首先帶來projectX創建於生活,那麼,第二個加入進一步構造函數projectX創建該將返回一個subObj。此外,如果第16行的console.log((ProjectX.attr1)未經註釋,代碼將按照我預期運行。這似乎表明,在我引用它之前,ProjectX實體不是「存在」的。我對IIFE的理解是,它們立即運行,無論如何,ProjectX不是構造函數 - 它是一個全局變量。
在研究中,我發現function inside of IIFE not recognized這似乎是一個類似的領土,但與綁定一個事件DOM並不與我的查詢相似
第一個IIFE後面缺少一個分號,當console.log及其分號被刪除時變得相關。您可以搜索JS中需要分號的情況。另外,你可以嘗試使用es6和babel來更好地組織你的代碼並且具有更好的可讀性。 – sabithpocker
謝謝@sabithpocker。Re ES6我必須覆蓋目前常用的瀏覽器,我相信ES6還沒有完全覆蓋。 –
嘗試[Babel](https://babeljs.io) – sabithpocker