2015-01-08 43 views
0

開始查看適用於AngularJS的HotTowel模板,並且所有這些「爲什麼」問題都會出現在我的腦海裏。我清除了其中的一些,但無法清除此問題。即對控制器使用「立即調用函數表達式(IIFE)」。下面是從「shell.js」代碼HotTowel角度和立即調用函數表達式(IIFE)

(function() { 
     'use strict'; 

     var controllerId = 'shell'; 
     angular.module('app').controller(controllerId, 
      ['$rootScope', 'common', 'config', shell]); 

     function shell($rootScope, common, config) { 
      var vm = this; 
     //rest of the code omitted 

我不明白爲什麼在這裏使用IIFE。一個原因可能是如果我們不使用IIFE,那麼

var controllerId = "shell" 

將具有全局範圍(是否正確?)。我試圖去除IIFE風格,顯然它正在解決任何問題。我通過AngularJS Style Guide,但在那裏找不到解釋。有人可以請解釋我們通過採用這種方法獲得的好處嗎?

P.S.如果你認爲這不是這個問題的正確位置,請將我指向正確的位置。

回答

2

正如你所說,這是爲了防止添加到全球範圍。在你上面的代碼controllerIdshell函數將被添加到全局範圍,如果不使用IIFE。

有一個在John Papa's style guide一個解釋:

爲什麼?:一個IIFE刪除從全球範圍內的變量。這有助於 防止變量和函數聲明在全球範圍內的預計壽命超過 ,這也有助於避免變量 衝突。

爲什麼?:當你的代碼的微細化以及捆綁成一個單一的文件 部署到生產服務器,你可以有 變量和許多全局變量的衝突。通過爲每個文件提供變量範圍,IIFE可以保護您免受 的攻擊。

+0

這是回答您的問題嗎? –

+0

所以如果我們不使用這個var controllerId =「shell」,那麼我們不需要IIFE?除了聲明控制器ID之外,IIFE在控制器聲明中還會有哪些更好的情況? – JenonD

+0

好吧,另一個地方是我在指令聲明中看到的,var app = angular.module('app');當我們需要對應用程序的引用時正在使用它。如果不是使用IIFE的本地作用域,那麼我們必須命名app1,app2 ...十幾個名稱來引用應用程序的指令/服務 – JenonD

相關問題