这个问题实际上包含两个:
1 - 函数是否在javasript中创建自己的$ scope?
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,它是否被认为是全局的?它可以在该控制器的任何功能中访问,但只要在一个完全不同的控制器中调用 - 是的,它可以吗?
确认/拒绝任何人?
看来,将变量分配给$ scope global会被认为对我的测试有效。
答案 0 :(得分:1)
我会回答这个问题的方式与你拿到它的方式略有不同。我希望它可以帮助你重新思考你的状态。
1 - 函数是否在javasript中创建自己的$ scope? 他们确实创造了自己的范围。但是在范围内也可以使用周围的范围。因此,当您在函数内编写函数时,内部函数可以使用外部函数的所有变量
实施例
function foo() {
var a=5;
function bar() {
var b=4;
}
function hello() {
var c=3;
}
}
a适用于所有功能,foo,bar和hello b不适用于foo或hello。 c不适用于foo或bar。
2 - 只是使用函数外部的对象是一个有效的替代方法: 所以,你应该尝试创建一个外部函数;在那里你可以声明将严格包含在该外部函数中的变量。 您在此外部函数中创建的任何函数都可以使用该外部作用域。
如果可能,应避免使用全局变量。
一个例子:jQuery。
jQuery有一个全局变量:var jQuery(你也可以通过别名$访问它)。 jQuery使用的变量不会与您使用的任何变量冲突。 你想从jQuery中获得任何东西,你将不得不通过$(或jQuery)
答案 1 :(得分:1)
关于您的第一个问题,没有,函数不会自己创建新的$scopes
(请注意,我们正在讨论的是范围而不是闭包,这是两个不同的概念)。
在您的示例中,$scope.foo
函数在定义bar
的同一$scope
对象上创建新的foo
属性。最终的$scope
对象看起来像这样:
$scope {
foo: function() {
$scope.bar = "Bar";
},
bar: "Bar"
}
您的测试问题可能与.
之前遗失的not
有关。
expect(scope.patientName).not.toBeUndefined();
是一种有效的替代方法,只是为了使用存在于外部的对象 功能:
是,您可以使用在函数外部定义的对象。
如果对象位于同一个$scope
对象上,则没有任何问题,只需确保在运行该函数之前已定义,否则您将获得{{1}错误。