0

我似乎无法谷歌的快速问题......

我想知道如何通过闭包来保持数组引用。我认为。我使用 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 函数

4

1 回答 1

0

您正在保留参考。正如您自己指出的那样,问题是您过早地清空数组。我相信您需要一份副本

var resetTiles = reset(filteredTiles.slice(0));
$timeout(resetTiles, $scope.delay);

另请注意,您没有将函数传递给$timeout,而是立即调用flipSelectedTiles(除非flipSelectedTiles返回函数)。

于 2013-09-13T21:26:05.157 回答