【问题标题】:returning a function that uses a var declared in the parent function [duplicate]返回一个使用在父函数中声明的var的函数[重复]
【发布时间】: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,会返回一个新函数,只要该函数在闭包中还活着,arraycopy 就可以被调用。可能发生的最有趣的事情(毕竟所有单词都过去了一次),如果 array 发送更改(因为它是一个参考),该函数也将在下一次重置时适应这些更改 ^_^跨度>
  • 内部函数是known as a closure,它“关闭”外部词法变量,并在返回时将其带走。

标签: javascript function random scope


【解决方案1】:

这是 JavaScript 中 [closures] 的示例。

根据 MDN,JavaScript 中的函数形成闭包。闭包是函数和声明该函数的词法环境的组合。此环境由创建闭包时范围内的任何局部变量组成。

在您的情况下,chooser 是对函数实例的引用,该实例在函数 randomNoRepeats 被调用时返回。此返回函数的实例维护对其词法环境的引用,其中存在变量copy。因此,当调用chooser 时,变量copy 仍然可以使用。

here阅读更多关于闭包的信息。

【讨论】:

  • 好的,谢谢你,我现在明白了,这总是上下文的错
  • 我在阅读您的回答后就这样做了,但是由于我昨天创建了帐户,所以我的点赞记录会被记录下来,直到我获得 15 个声望点
  • @soufianeyakoubi 谢谢:)
猜你喜欢
  • 1970-01-01
  • 2016-08-04
  • 2021-05-30
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 2013-06-14
  • 2013-03-16
  • 2014-02-25
相关资源
最近更新 更多