现有函数作为Array.forEach的回调函数

时间:2016-01-07 22:44:26

标签: javascript angularjs callback

这段代码的奇怪行为:

我有一些Angular控制器:

.controller('View1Ctrl', ['$scope', 'CrawlServerExecutor', function ($scope, CrawlServerExecutor) {

    $scope.results = [];

    var showResults = function (results) {
        results.forEach(function (result) {
            $scope.results.push(result);
        });
    };

这样写的时候:

    var showResults = function (results) {
        results.forEach($scope.results.push);
    };

我收到此错误: Error: undefined is not an object为了尝试访问push函数,我在调试器中查看$scope.results并且对象被识别为数组,但由于某种原因,在此语法中它没有引用它&# 39; s push功能。我更喜欢这段代码,因为它更优雅。

任何人都知道为什么会这样?

由于

3 个答案:

答案 0 :(得分:5)

您需要将数组绑定到函数,因此可以在正确的上下文中调用它(this设置正确)。

results.forEach($scope.results.push.bind($scope.results));

答案 1 :(得分:0)

在后一种表示法中,您传递了push函数的引用。因此,在push函数本身(这是一些定义的javascript代码)中,“this”-reference将是“window”。 如果您调用没有任何绑定上下文的函数,则会发生这种情况。 在第一种情况下,您调用$ scope.results.push(result),因此上下文(因此push函数中的“this” - 参考)将是$ scope.results数组。 在javaScript中,“this”可以根据上下文而改变。

现在的问题是Array-Prototype的push函数假定上下文将是数组本身,而这里并非如此。

所以你能做的就是用“绑定”方法将特定的上下文“绑定”到裸函数。

所以你可以试试

results.forEach ($scope.results.push.bind($scope.results));

现在push函数中的上下文(this变量)将再次是$ scope.results数组,函数将正常工作

答案 2 :(得分:0)

你得到一个例外,因为当push(函数Array.prototype.push)被调用时,它被调用而没有上下文,没有任何this值来操作。 这样做就像在undefined上调用它,这是错误消息告诉你的......

你基本上做的是连接2个数组并保持最终结果。

您不需要自己迭代数组来执行此操作。

您可以使用以下方法简化代码:

$scope.results = $scope.results.contact(results);

或者,如果您更喜欢$scope.results的“到位突变”,请尝试:

[].push.apply($scope.results, results);

或者,如果您真的要自己迭代并使用forEach,请使用最后一个参数传递this上下文:

results.forEach($scope.results.push, $scope.results);