这段代码的奇怪行为:
我有一些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
功能。我更喜欢这段代码,因为它更优雅。
任何人都知道为什么会这样?
由于
答案 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);