2014-02-07 27 views
1

我试着学习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; 
} 

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

谢谢!

+1

http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – Mik378

+0

请阅读:http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – Pawel

+1

@Pawel可能重复我的评论;);) – Mik378

回答

0

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

+0

但是当我在闭包中访问一个带有“this”的变量时,范围改变了? – Gerrit

+0

'this'是指使用它的直接函数 - 因此''benchmark''第一行中使用的'this'不会与'repeat'的第一行中使用的'this'相同。 – kaspermoerch

+0

但是,为什么this.startin benchmark()不会指向与var start = [];相同的值。 – Gerrit

0

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

瓶盖通常与特殊的数据结构,它 包含一个指向函数的代码,再加上 函数的词法环境的表示实现(即,可用的变量集中)在时刻 当闭合创建

在你的情况,这是在重复调用的回调(动作)是关闭和它的词法环境中,你有起点,终点,计时和所有可用的全局变量。

0

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