2014-01-30 61 views
0

將函數添加到$ scope並且不需要在$ scope上有一個主要的性能好處嗎?

例如:

function myCtrl($scope){ 
    $scope.myFunc = function(){ 
     // my function on scope 
     var four = myHelperFunc(2); 
     return four; 
    } 

    function myHelperFunc(number){ 
     // my helper function 
     return number * 2; 
    } 
} 

對:

function myCtrl($scope){ 
    $scope.myFunc = function(){ 
     // my function on scope 
     var four = $scope.myHelperFunc(2); 
     return four; 
    } 

    $scope.myHelperFunc = function(number){ 
     // my helper function on scope 
     // is this better than the previous example? 
     return number * 2; 
    } 
} 
+0

我懷疑表現會比微不足道。你只是給範圍另一個變量留意。如果您需要擴展應用程序以注意特定範圍,那麼稍後可能會有用。 – sksallaj

回答

2

首先是更好,它將使用詞法作用域。第二個將在堆上使用對象狀態存儲器。隨着對象數量的增加,您將消耗更多的內存,以保持參考$scope.myHelperFunc。總而言之,我建議不要擔心這一點,最好是編寫乾淨的代碼來表達你在做什麼。在這個例子中,性能差異非常小,它取決於客戶端的實際供應商的JS引擎實現,這是您無法真正控制的。除非...它是服務器端代碼。

+0

謝謝你這麼詳細的回答@pid,我主要關心的是當你在一個角度應用程序中更改控制器時,當前作用域被破壞,但是不在作用域上的函數是否仍然佔用內存? – Cameron

+0

這取決於JS引擎。我可以想象,Google的V8(用於Chromium,因此* Chrome *瀏覽器)會盡可能長時間地將編譯後的函數保存在內存中,這是一件好事。小的處理程序,因爲它們佔用了數百個字節(可能數千個,但不是更多)。因此,在一款低端智能手機上,128 MB內存(今天不算太多),這是海洋中的一小部分。性能方面,V8將這些字節保存在內存中可節省大量CPU時間。 – pid

0

後者沒有性能優勢。最後,一個函數仍然被調用。不同的是你是否希望你的幫助函數能夠從UI中調用。在$範圍內,您可以對控制訪問的控制器內的代碼進行編碼,並且只能從您的函數中調用它。與性能相比,它更像是API可見性問題。

相關問題