2014-10-17 92 views
0

這個問題確實包含兩個:

1 - 函數是否在javasript中創建它們自己的$作用域?

e.g.$scope.foo = function() { 
    $scope.bar = "Bar";  
} 

我問這個,因爲在這樣一個測試,我試圖運行我檢查,以確定該作用域的變量的存在,運行一個函數,然後重新檢查:

iit('getPatientFirstName should attach patientName to the scope', function() { 
    // Passes 
    expect(scope.patientName).toBeUndefined(); 
    spyOn(scope,'getPatientFirstName').andCallThrough(); 
    scope.getPatientFirstName(detailsBody); 

    // Fails 
    expect(scope.patientName)not.toBeUndefined(); 
}); 

// In the controller 
$scope.getPatientFirstName = function (dataBody) { 
     $scope.patientName = dataBody.patientFirstName; 
}; 

所以這表明他們可能有自己的範圍?如果是這種情況,我們可以測試一下嗎?

2 - 是一個有效的替代只是使用存在的功能之外的對象:

$scope.patientDetails = { 
     patientName: '' 
}; 

$scope.getPatientFirstName = function (dataBody) { 
     $scope.patientDetails.patientName = dataBody.patientFirstName; 
}; 

感謝

編輯 考慮到兩個答案已經提出了另外一個問題 - 是一個變量(屬性或對象)如果它附加到$範圍,則認爲是全局的?它可以在該控制器的任何功能中訪問,但只要在完全不同的控制器中調用 - 是的,它可以?

確認/拒絕任何人?

看來,將變量分配給$ scope全局對於我的測試來說被認爲是有效的。

回答

1

關於你的第一個問題,沒有,功能不被自己(創建新$scopes注意,我們談論的是範圍而不是關閉,這是兩個不同的概念)。

在您的示例中,$scope.foo函數會在定義了foo的相同$scope對象上創建新的bar屬性。最後$scope對象會是這個樣子:

$scope { 
    foo: function() { 
    $scope.bar = "Bar";  
    }, 
    bar: "Bar" 
} 

與測試該問題可能在not前進行相關的失蹤.

expect(scope.patientName).not.toBeUndefined(); 

是一個有效的替代只是使用存在的 功能之外的對象:

,你可以用一個在函數外部定義的對象。

如果對象是相同的$scope對象,你不會有任何問題,只需確保它被定義在運行功能前,否則你將得到一個$scope.patientDetails is not defined錯誤。

+0

。不是在我的測試中 - 我實際上沒有複製和粘貼上面的代碼 - 只是輸入它,所以這就是爲什麼它不在那裏。 – Katana24 2014-10-17 09:26:55

1

我會回答這個問題,與你採取的方式有點不同。我希望它能幫助你重新思考你的狀態。

1 - 函數是否在javasript中創建自己的$ scopes? 他們確實創造了一個自己的範圍。但是範圍內也可以使用周圍的範圍。所以,當你在一個函數中寫一個函數,內部函數可以使用外部函數

實例的所有變量

function foo() { 
    var a=5; 
    function bar() { 
    var b=4; 
    } 
    function hello() { 
    var c=3; 
    } 
} 

一個可用於所有的功能,FOO,酒吧和你好。
b不適用於foo或您好。 c不適用於foo或酒吧。

2 - 是一個有效的替代方案,只是使用存在於函數外部的對象: 因此,您應該嘗試創建一個外部函數;那裏你可以聲明將被嚴格包含在該外部函數中的變量。 您在此外層功能中創建的任何功能都可以使用該外層功能。

如果可能,應避免全局變量。


一個例子:jQuery。

jQuery有1個變量是全局變量:var jQuery(你也可以通過它的別名$來訪問它)。 jQuery使用的變量不會與您使用的任何變量衝突。 你從jQuery的想要的東西,你將不得不通過$(或jQuery的)

+0

我知道JavaScript運行在父系般的方式 - 在子功能有權訪問父範圍,但家長沒有訪問子範圍。但是如果一個變量在範圍上,它被認爲是全局變量?如果它被宣佈爲var – Katana24 2014-10-17 09:30:37

+0

,我認爲它會被認爲是全球性的。這是另一種方式。當你使用var時,變量被設置在本地作用域中。當你聲明一個沒有var的變量時,變量將被設置爲全局變量。 – 2014-10-17 09:38:30

+0

好的 - 我會測試一下 – Katana24 2014-10-17 09:42:09