我似乎无法谷歌的快速问题...
我想知道如何通过闭包来保持数组引用。我认为。 我使用AngularJS但原始JS在我的试验中具有相同的行为。 上下文:想一下你匹配两个图像的记忆游戏。当两个选定的图块不匹配时,它们会在显示所选图像后向后翻转。所以我想延迟翻转。 我有一个数组,我.filter到一个新的数组。
$scope.selectedTiles = $scope.tiles.filter($scope.filterSelected);
抛开:这个新阵列;它只包含数据的引用或副本吗? MDN说
构造一个新的数组,其中所有值的回调都返回一个真值。
不太清楚imo。我的结论是它们是参考文献。 反正...
此selectedTiles被发送到闭包以保持其引用。只有它没有。
flipSelectedTiles = function (selection){
return function(){
selection.forEach($scope.flipTile);
}
};
function reset(selection){
return function(){
$scope.flipSelectedTiles(selection);
}
}
var resetTiles = reset(filteredTiles);
$timeout($scope.flipSelectedTiles($scope.selectedTiles), $scope.delay);
我需要这个,因为我打算在执行flipSelectedTiles之前等一会儿。 我还需要立即清除selectedTiles,以防有人点击另一张图片。
selectedTiles.splice(0, $scope.selectedTiles.length);
当超时触发时,数组为空并且没有任何反应。
如何通过闭包保持数组引用?
编辑:这是普通JS http://jsfiddle.net/Tobis/TkjEF/中的小提琴 编辑:添加了flipSelectedTiles函数
答案 0 :(得分:0)
您正在参考。问题是你过早地清空阵列,就像你自己注意到的那样。我相信你需要一个副本:
var resetTiles = reset(filteredTiles.slice(0));
$timeout(resetTiles, $scope.delay);
另请注意,您没有将函数传递给$timeout
,而是立即调用flipSelectedTiles
(除非flipSelectedTiles
返回函数)。