【发布时间】:2018-12-01 13:05:02
【问题描述】:
这是一个从给定数组中随机选择项目的函数,直到所有项目都被取出,然后才重复
我实际上是从帖子中复制了代码,因为我无法理解变量副本的作用域是如何工作的。
PS : 这是How to efficiently randomly select array item without repeats?的帖子
提前感谢您的帮助。
function randomNoRepeats(array) {
var copy = array.slice(0);
return function() {
if (copy.length < 1) { copy = array.slice(0); }
var index = Math.floor(Math.random() * copy.length);
var item = copy[index];
copy.splice(index, 1);
return item;
};
}
var chooser = randomNoRepeats(['Foo', 'Bar', 'Gah']);
chooser(); // => "Bar"
chooser(); // => "Foo"
chooser(); // => "Gah"
chooser(); // => "Foo" -- only repeats once all items are exhausted.
【问题讨论】:
-
您的问题到底是什么?
chooser是如何保留copy的? -
调用
randomNoRepeats,会返回一个新函数,只要该函数在闭包中还活着,array和copy就可以被调用。可能发生的最有趣的事情(毕竟所有单词都过去了一次),如果array发送更改(因为它是一个参考),该函数也将在下一次重置时适应这些更改 ^_^跨度> -
内部函数是known as a
closure,它“关闭”外部词法变量,并在返回时将其带走。
标签: javascript function random scope