2015-10-07 30 views
1

我有一個角指令的一個大的代碼庫,我一直是這樣聲明函數:使用命名功能,或將他們的內部範圍

$scope.doFoo = function() { ... }; 

,因爲我覺得角可以管理/需要時釋放的功能(不太確定我在哪裏閱讀)。

無論如何,我的項目貢獻者告訴我,他認爲這是不正確的。是否有聲明的功能範圍變量或只是聲明爲純函數像這樣有什麼區別:

function doFoo() { ... }; 

一個我應該使用哪一個?

+0

如果你不需要在你的項目的其他部分該功能除了邏輯在你的指令比使用命名功能,如在面向對象的私有方法。 – Grissom

回答

3

使用前一種方法,很容易使範圍與視圖不需要的功能(例如控制器內的實用程序/幫助程序功能)混淆。我認爲有一個頂層視圖使用的函數/變量列表是合乎邏輯的,分配給範圍。即:

$scope.doFoo = doFoo;

然後,對文件的底部,你可以組織功能。即:

function doFoo() { ... ]

沒有做$scope.doFoo,你將無法使用doFoo在你的模板(如<div ng-click="doFoo()">)。

通過這種方式,如果doFoo()需要使用一些輔助函數,您可以在控制器的某個地方聲明它,而不是通過添加它來混淆範圍。

我更喜歡使用controllerAs語法,並綁定vmthis,但這是一個不同的故事。 (可以閱讀關於該樣式偏好here。)

+1

使用命名函數而不是範圍函數時是否有任何性能提升? – alexandernst

+2

性能的負載?不,但你會減少範圍混亂,這可以幫助你的代碼更具可讀性和可維護性。 –

1

綁定到$scope或控制器(通過控制器A)的任何函數(方法?)都將在它們所連接的視圖上可用。以更傳統的方式命名的功能只能在其各自的(lexical)作用域(是控制器,服務,指令等)訪問。基本上,$scope允許你在其詞法範圍外使用你的函數(爲了說明,$ scope是一個在控制器/指令的詞法範圍之外可用的對象,就像在服務中聲明函數一樣,你不能使用它們除非將它們附加到返回的對象)。

每個應用程序都有自己的位置,這取決於您想如何使用該功能。

+0

使用命名函數而不是範圍函數時是否有任何性能提升? – alexandernst

1

是的,有一個合理的區別,您只需要將函數綁定到視圖中使用的範圍。沒有必要用視圖中從未使用過的東西來污染範圍。

一個共同的風格指南的最佳做法也宣佈以下範圍內聲明的功能,使其更容易查看什麼是包含範圍內更容易

例子:

// show all the scope related stuff at top of component 
$scope.foo = foo;// reference to function below  

// all the business stuff at bottom of component 
function foo(){}//used in view 

function bar(){} // only used as utility in controller 

很好的參考:John Papa Angular style guide

+0

使用命名函數而不是範圍函數時是否有任何性能提升? – alexandernst

+1

收益將不會污染不需要的範圍 – charlietfl

+1

是的,如果有任何表現收益,它充其量是微不足道的。主要好處是保持您的代碼組織。 –

2

Zack Tanner的回答是正確的(並且簡潔!),但這裏有一些補充信息可能也會幫助你。

首先,這裏有一些條款,我們可以同意:


函數聲明

function doFoo() { 
    //... 
} 

聲明一個函數當前功能範圍內(關閉)

函數表達式

$scope.doFoo = function() { 
    //... 
} 

聲明一個函數屬於一個對象


所以,有什麼區別,爲什麼你要在乎?這裏是扎克坦納在行動解釋:

所有的
angular.module("myModule").controller(["$scope", function($scope) { 
    var self = this; 

    $scope.doFoo = doFoo; 
    $scope.doBar = doBar; 

    ////Implementation//// 

    function doFoo() { 
    // do foo stuff 
    } 

    function doBar() { 
    // do bar stuff 
    } 
}]); 

首先,這可能是公然(理所當然),從出現在C/C++編程或John Papa智慧被盜。在任何一種情況下,這個原因是有效的(並且如果你在控制器的評論之前加入return)甚至會起作用,這是因爲函數提升。基本上,它歸結爲一條簡單的規則:函數聲明將始終「掛起」到它們在中聲明的範圍的頂部。 var iables也是如此!

直接回答你的問題,我不知道角的釋放或管理功能(我懷疑它?)的能力,但它確實在這種情況下支付來聲明函數,並將它們分配給您的$scope。另外,「控制器作爲」的語法確實很棒,所以如果可能的話,請考慮使用它(沒有$scope,加上原型鏈沒有奇怪!)。

TL;醫生使用function doFoo() { //... }