1

我正在阅读“Javascript:The Good Parts”一书中的闭包。

以下是使用闭包的示例:

var add_the_handlers = function (nodes) {
var i;
   for (i = 0; i < nodes.length; i += 1) {
      nodes[i].onclick = function (i) {
         return function (e) {
            alert(i + ":" + e);
         };
      }(i);
   }
};

是正确的例子吗?还是会有很多正确的例子?

var add_the_handlers = function (nodes) {
var i;
   for (i = 0; i < nodes.length; i += 1) {
      nodes[i].onclick = function (idx) {
         return function (e) {
            alert(idx + ":" + e);
         };
      }(i);
   }
};

外部函数中的变量 i 和内部函数中的变量 i "nodes[i].onclick = function (i)" - 这是两个不同的变量。第三个函数从第二个函数访问变量,而不是从最外面。
我对么?

4

4 回答 4

2

是的,示例正确。您作为函数参数看到的i变量优先于外部i变量,因为它是在本地范围内声明的。

于 2012-06-19T06:28:34.027 回答
2

这两个例子是相同的。闭包的全部意义在于将外部范围的变量 (i) 变成内部范围的变量(i/idx/foo,随你选择)。闭包创建变量的“副本”,以便在进行回调时,它具有正确的值。

// outer-scoped i changes on each iteration
var i;

for (i = 0; i < nodes.length; i += 1) {
   nodes[i].onclick = function (i) {

      // here i now refers to a different variable; while the outer i keeps iterating,  
      //this i is preserved at its current value.
      return function (e) {
         alert(i + ":" + e);
      };
   }(i);
}
于 2012-06-19T06:28:49.800 回答
0

从 javascript 的角度来看 - 这两个是相同的。因此,这是品味的问题。如果内部有更多闭包,那么最好使用不同的名称。但是这里的例子很简单——没有必要这样做。

于 2012-06-19T06:28:46.977 回答
0

不,您发布的两个示例完全相同。唯一的区别只是函数的参数名称,但这没关系,你可以使用任何东西。

于 2012-06-19T06:30:22.480 回答