【发布时间】:2014-06-12 14:01:41
【问题描述】:
这更像是一个通用的 javascript 闭包和作用域函数,但我会在遇到它的 angular 上下文中询问它。假设我有以下控制器:
var Controller = function ($scope, factory) {
$scope.Letter = 'A';
/*
Some other code
.
.
.
*/
$scope.OnClick = function() {
console.log($scope.Letter);
SomethingWithCallBack('a param', 34, function() {
console.log($scope.Letter);
});
}
};
假设在 $scope.Letter 更新的地方发生了一些事情,然后 OnClick 被触发。 OnClick 内部的 $scope.Letter 保持原始值。我可以通过将行更改为console.log(this.Letter); 来解决此问题。但是,我不能在SomethingWithCallBack() 的匿名函数中这样做。我目前通过为变量分配this.Letter 的值来解决问题,如下所示。
var myLetter = this.letter;
SomethingWithCallBack('a param', 34, function() {
console.log(myLetter);
});
有没有办法在回调中引用“外部 this”,这样我就不必分配变量了?
【问题讨论】:
-
onclick 中的 $scope.letter 保持原值是什么意思?因为那不是真的。如果您更新 $scope.letter,那么它将是您调用 onClick 时的新值。现在,您似乎确实直接在作用域上使用了原语,所以这会给您带来继承作用域的问题,这可能会导致您认为它不会改变
-
“在示波器上使用原语”是什么意思?您的意思是原始的范围成员(整数字符串和日期)?
-
正确。通过从子范围设置范围的原始值,将不会更改父范围值。子作用域将有自己的(同名)字段和自己的值。因此,您应该始终将对象放在您设置字段的范围内。
标签: javascript angularjs closures