2017-05-20 67 views
1

這是一個自學成功的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並不與我的查詢相似

+1

第一個IIFE後面缺少一個分號,當console.log及其分號被刪除時變得相關。您可以搜索JS中需要分號的情況。另外,你可以嘗試使用es6和babel來更好地組織你的代碼並且具有更好的可讀性。 – sabithpocker

+0

謝謝@sabithpocker。Re ES6我必須覆蓋目前常用的瀏覽器,我相信ES6還沒有完全覆蓋。 –

+1

嘗試[Babel](https://babeljs.io) – sabithpocker

回答

3

在第一個IIFE之後缺少一個分號,當它的分號console.log被刪除時該分號變得相關您可以搜索JS

中需要分號的情況

沒有分號,你的代碼可以解釋爲:在格式(IIFE)()()

(function() { 
    var ProjectX = { 
     attr1: 'I am inside ProjectX' 
    } 
    window.ProjectX = ProjectX; 
})()(function() { 
    ProjectX.subObj = function(val) { 
     this.name = val; 
     return this; 
    }; 
})(); 

檢查下面的函數,這個工程因爲IIFE返回一個函數,該函數被調用,('Hey')

(function() { 
 
     return function(msg){console.log(msg)} 
 
    })()('Hey')

沒有分號,javascript期望您的第一個IIFE返回一個函數,而不是c與您的代碼,所以它會拋出一個Type錯誤,說它期待一個函數,但得到了undefined。你的代碼最終計算結果爲:

undefined(function() { 
    ProjectX.subObj = function(val) { 
     this.name = val; 
     return this; 
    }; 
})(); 

或更簡化爲

undefined(<a function as parameter>)() 

,然後拋出一個function這裏有望代替undefined錯誤。

閱讀關於JavaScript中高階函數的更多信息,以便更好地理解此語法以及您的代碼是否模糊不清。

+0

只是爲了確認,JS將它視爲類似()()()()它解決了從右到左的問題?所以第一個IIFE在第二個之前沒有被評估過,那時ProjectX沒有被定義。正確嗎? –

+0

不,這不對,它與被定義的ProjectX無關。 'myFunction()()()'更像從左到右而不是從右到左評估。我會嘗試更新答案以包含更多詳細信息。 – sabithpocker