JavaScript回调而不改变范围?

时间:2014-02-07 10:32:32

标签: javascript

我尝试学习javascript,因此我尝试了以下代码:

function repeat(n, action) {
    for (var i = 0; i < n; i++) {
        action();
    }
}
function benchmark() {
    var start = [], end = [], timings = [];
    repeat(1000, function() {
        start.push(Date.now());
        // Repeat something
        end.push(Date.now());
    });

    for (var i = 0; i < end.length; i++) {
        timings[i] = end[i] - start[i];
    }

    return timings;
}

我现在的问题:为什么我可以在回调中访问开始和结束?据我所知,范围从基准变为重复。回调是闭包还是在另一个函数中是一个已定义的命名函数的闭包?

谢谢!

3 个答案:

答案 0 :(得分:0)

简而言之 - 您的回调嵌套在benchmark内,这意味着它可以访问benchmark闭包内的变量。 repeat未嵌套在benchmark中,因此无法访问benchmark闭包中的变量。

答案 1 :(得分:0)

要了解您必须了解closure的概念。

  

闭包通常使用特殊的数据结构实现   包含一个指向功能代码的指针,以及一个表示   函数的词汇环境(即可用变量集)   在创建闭包时

在你的情况下,在repeat( action )中调用的回调是一个闭包,在它的词汇环境中你有开始,结束,时间和所有可用的全局变量。

答案 2 :(得分:0)

但是当我在闭包中访问带有“this”的变量时,范围会改变吗?如果我通过this.start = []初始化会发生什么?重复函数的第一行中的数组?