我尝试学习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;
}
我现在的问题:为什么我可以在回调中访问开始和结束?据我所知,范围从基准变为重复。回调是闭包还是在另一个函数中是一个已定义的命名函数的闭包?
谢谢!
答案 0 :(得分:0)
简而言之 - 您的回调嵌套在benchmark
内,这意味着它可以访问benchmark
闭包内的变量。 repeat
未嵌套在benchmark
中,因此无法访问benchmark
闭包中的变量。
答案 1 :(得分:0)
要了解您必须了解closure的概念。
闭包通常使用特殊的数据结构实现 包含一个指向功能代码的指针,以及一个表示 函数的词汇环境(即可用变量集) 在创建闭包时
在你的情况下,在repeat( action )中调用的回调是一个闭包,在它的词汇环境中你有开始,结束,时间和所有可用的全局变量。
答案 2 :(得分:0)
但是当我在闭包中访问带有“this”的变量时,范围会改变吗?如果我通过this.start = []初始化会发生什么?重复函数的第一行中的数组?