Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中获取闭包中变量的值_Javascript_Closures - Fatal编程技术网

如何在javascript中获取闭包中变量的值

如何在javascript中获取闭包中变量的值,javascript,closures,Javascript,Closures,我正在创建一个回调数组,如下所示: function createFunctions(n) { var callbacks = []; for (var i=0; i<n; i++) { callbacks.push(function() { return i; }); } return callbacks; } function创建函数(n){ var回调=[]; 对于(var i=0;i一个闭包对它关闭的变量有一个持久的引用,而不是它们

我正在创建一个回调数组,如下所示:

function createFunctions(n) {
  var callbacks = [];

  for (var i=0; i<n; i++) {
    callbacks.push(function() {
      return i;
    });
  }

  return callbacks;
}
function创建函数(n){
var回调=[];

对于(var i=0;i一个闭包对它关闭的变量有一个持久的引用,而不是它们在创建时的值的副本。这就是为什么所有函数都会看到
6
:这是
i
在调用这些函数时的值

如果您需要它们查看不同的值,请将闭包关闭在其他不变的值上。以下是一种方法:

function createFunctions(n) {
    var callbacks = [];

    for (var i=0; i<n; i++) {
      callbacks.push(makeCallback(i));
    }

    return callbacks;

    function makeCallback(index) {
        return function() {
          return index;
        };
    }
}

如果由
allocator
创建的函数具有
start
值的副本,则这将不起作用。它起作用是因为由
allocator
创建的函数具有引用(通过上下文)变量本身。

那么函数中的匿名函数不能创建闭包吗?@KevinBowersox:当然它创建了(或者更确切地说,是)闭包。我建议它不创建闭包吗?(真正的问题;你是个聪明人,我可能有点说错了。)我的问题可能问得不正确。如果我试图创建一个捕获变量的闭包,我可以在声明该变量的函数中形成该闭包,还是必须在包含该变量的函数之外的函数中形成闭包。@KevinBowersox:啊,我明白你的要求。你可以在该函数中实现它。闭包在哪里并不重要,重要的是闭包所使用的部分。因此,
makeCallback
可以在
createFunctions
内部或外部,前提是它使用的上下文的唯一部分是
index
参数。如果它需要调用的上下文的其他方面e> createFunctions
,它需要在
createFunctions
中。在这个特定的示例中,它不是,但它通常是。@KevinBowersox:当我说“这不重要”时我有点松懈。一般来说,在可以创建闭包的最外层范围内创建闭包;例如,尽可能少地关闭闭包。这可以最大限度地减少不必要的创建函数。因此,在上面的例子中,我们不需要在
createFunctions
中使用闭包。也就是说,在现代引擎中,做看起来最可读和可维护的事情,提高性能与可读性和可维护性相比,这是一个遥远的问题。
function createFunctions(n) {
    var callbacks = [];

    for (var i=0; i<n; i++) {
      callbacks.push(makeCallback(i));
    }

    return callbacks;

    function makeCallback(index) {
        return function() {
          return index;
        };
    }
}
function createFunctions(n) {
    var callbacks = [];

    for (var i=0; i<n; i++) {
      callbacks.push(makeCallback(i));
    }

    return callbacks;

}

function makeCallback(index) {
    return function() {
      return index;
    };
}
function allocator(start) {
    return function() {
        return ++start;
    };
}
var f = allocator(0);
alert(f()); // "1"
alert(f()); // "2"
alert(f()); // "3"