“Javascript:好的部分”中的闭包示例

时间:2012-06-19 06:25:50

标签: javascript

我正在阅读“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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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);
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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