这只是一个嵌套函数。它可以访问now
变量,因为函数可以访问定义它们的范围内的变量(这实际上也是全局变量的工作方式)。它被称为“闭包”(它“关闭”其定义范围内的变量),这听起来很晦涩,但不要担心——一旦你知道了一些关于如何的事情,闭包并不复杂 (披露:我的博客) JavaScript 有效。
这里有趣的是它关闭了now
特定于特定调用的变量updateItems
,并且它具有的引用是实时的(它不是创建函数时的副本now
)。每次调用updateItems
都会创建一个您传递给的新each
匿名函数,并且每个函数都可以访问now
在调用期间创建的变量updateItems
。在您的情况下,您只是立即使用它并返回,但是如果您保留对该函数的引用呢?然后怎样呢?答案是很好,它保留了对其相关now
变量的引用:
function say(msg) {
var f = function() {
alert(msg);
};
return f; // We return a reference to the function
}
var s1 = say("Hi");
var s2 = say("there");
s1(); // Alerts "Hi" (see below)
s2(); // Alerts "there"
对s1
警报的调用是"Hi"
因为我们调用创建的函数say
仍然可以访问msg
我们提供给的参数say
,即使say
已经返回。s2
当然,对于也是如此。
并且只是为了证明它不是创建函数时的副本:
function say(msg) {
// Create the function
var f = function() {
alert(msg);
};
// Update `msg`
msg += " (updated)";
// Return the function
return f;
}
var s1 = say("Hi");
var s2 = say("there");
s1(); // Alerts "Hi (updated)"
s2(); // Alerts "there (updated)"
看看该函数如何使用更新版本的msg
,即使该函数是在我们更新它之前创建的。该函数可以访问变量本身,而不是变量值的副本。