angular.forEach中无法访问变量

Vur*_*ral 22 javascript foreach angularjs

我有服务

app.service('myService', function() {
    this.list = [];
    this.execute = function() {
        //this.list is reachable here
        angular.forEach(AnArrayHere, function(val, key) {
           //this.list is not reachable here
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至在控制器中也可访问

function Ctrl($scope, myService) {
    $scope.list = myService.list;
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么在angular.foreach中无法访问"this.list",我该如何访问"this.list"?

dnc*_*253 52

angular.forEach(参见http://docs.angularjs.org/api/angular.forEach)函数中的最后一个参数是for的上下文this.所以你会想要这样的东西:

app.service('myService', function() {

    this.list = [];

    this.execute = function() {

        //this.list is reachable here

        angular.forEach(AnArrayHere, function(val, key) {
           //access this.list
        }, this);

    }
}
Run Code Online (Sandbox Code Playgroud)


Coi*_*_op 6

this.list在foreach中不可访问的原因是因为该函数调用的上下文已更改。它在execute方法内部起作用,因为该方法与list属于同一上下文。

由于所有的关闭,我会将this上下文分配给另一个变量,然后可以在以后调用它。像这样:

app.service('myService', function() {

    var self = this;
    self.list = [];

    self.execute = function() {
        //this.list and self.list are reachable here
        angular.forEach(AnArrayHere, function(val, key) {
           //self.this == this.list
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

与在foreach方法调用中传递上下文相比,这是一种更为通用的解决方案,并且可以在其他与闭包相关的情况下使用。