如何通过闭包保持数组引用?

时间:2013-09-13 21:08:50

标签: javascript arrays closures pass-by-reference

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

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

1 个答案:

答案 0 :(得分:0)

您正在参考。问题是你过早地清空阵列,就像你自己注意到的那样。我相信你需要一个副本

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

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