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

“中的闭包示例”;Javascript:好的部分;,javascript,Javascript,我正在阅读“Javascript:好的部分”一书中关于闭包的内容 下面是使用闭包的示例: 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);

我正在阅读“Javascript:好的部分”一书中关于闭包的内容

下面是使用闭包的示例:

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\u\u处理器=函数(节点){
var i;
对于(i=0;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);
   }
};
var add\u\u处理器=函数(节点){
var i;
对于(i=0;i
外部函数中的变量i和内部函数“nodes[i].onclick=function(i)”中的变量i是两个不同的变量。 第三个函数从第二个函数而不是从最外层访问变量。

我说的对吗?

是的,这个例子是正确的。您视为函数参数的
i
变量优先于外部
i
变量,因为它是在局部范围内声明的。

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

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

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

这两个例子是相同的。闭包的全部要点是将外部作用域变量(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);
}
//外部作用域i在每次迭代中都会更改
var i;
对于(i=0;i
这两个示例是相同的。闭包的全部要点是将外部作用域变量(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);
}
//外部作用域i在每次迭代中都会更改
var i;
对于(i=0;i
不,您发布的两个示例完全相同。唯一的区别是函数的参数名,但这无关紧要,您可以使用任何名称。

不,您发布的两个示例完全相同。唯一的区别就是函数的参数名,但这并不重要,您可以使用任何名称。

两个版本都做相同的事情。在我看来,由于变量名不同,您的版本更容易阅读。一般来说,当在不同的作用域中有相同名称的变量时,将使用的变量是最接近(或在)当前作用域中定义的变量。两个版本都做相同的事情。在我看来,由于变量名不同,您的版本更容易阅读。在一般意义上,当您在不同的作用域中有相同名称的变量时,将使用的变量是最接近(或在)当前作用域中定义的变量。您确定闭包会创建变量的“副本”吗?从书中“理解内部函数可以访问外部函数的实际变量而不是副本以避免以下问题非常重要”。您确定闭包会创建变量的“副本”吗?书中写道:“为了避免以下问题,必须理解内部函数可以访问外部函数的实际变量,而不是副本”,从javascript的角度来看,这两个示例是相同的。但是很难理解,在下面的函数调用中有两个不同的变量i—“function(i){}(i)”。从javascript的角度来看,这两个例子是相同的。但很难理解,在下面的函数调用中有两个不同的变量i—“function(i){}(i)”。