来自MDN的IIFE示例-重新引入Javascript页面

来自MDN的IIFE示例-重新引入Javascript页面,javascript,dom,recursion,iife,Javascript,Dom,Recursion,Iife,下面的代码片段来自MDN,它是对Javascript的重新介绍,应该是为了演示IIFE。我有点明白它应该计算这个文本节点中的字符数,但我不确定有几件事。第一个问题是为什么for语句在第一个参数部分var i=0,child中有两个参数。第二个更一般,它是如何处理这个函数调用自身的。。有人能给我解释一下整个流程吗 var charsInBody = (function counter(elm) { if (elm.nodeType == 3) { // TEXT_NODE return

下面的代码片段来自MDN,它是对Javascript的重新介绍,应该是为了演示IIFE。我有点明白它应该计算这个文本节点中的字符数,但我不确定有几件事。第一个问题是为什么for语句在第一个参数部分
var i=0,child
中有两个参数。第二个更一般,它是如何处理这个函数调用自身的。。有人能给我解释一下整个流程吗

var charsInBody = (function counter(elm) {
  if (elm.nodeType == 3) { // TEXT_NODE
    return elm.nodeValue.length;
  }
  var count = 0;
  for (var i = 0, child; child = elm.childNodes[i]; i++) {
    count += counter(child);
  }
  return count;
})(document.body);
第一个问题是为什么for语句在第一个参数部分var i=0,child中有两个参数

for循环只是while循环的浓缩版本,这意味着:

 for(declarations; condition; last) {
  body
 }
同:

 declarations
 while(condition) {
   body
   last
 }
这意味着在您的情况下:

 var i = 0, child; 
 while(child = elm.childNodes[i]) {
   count += counter(child);
   i++
 }
所以实际上
child
只是在循环之前定义了一个新变量

第一个问题是为什么for语句在第一个参数部分var i=0,child中有两个参数

for循环只是while循环的浓缩版本,这意味着:

 for(declarations; condition; last) {
  body
 }
同:

 declarations
 while(condition) {
   body
   last
 }
这意味着在您的情况下:

 var i = 0, child; 
 while(child = elm.childNodes[i]) {
   count += counter(child);
   i++
 }

因此实际上
child
只是在循环之前定义了一个新变量,用于第二个问题:逗号分隔的标识符
i
child
var
语句的参数。它只声明并初始化
i
,而只声明
child
。问题的第二部分显然是重复的,不幸的是,因此您应该在堆栈溢出上搜索其他IIFE和递归问题。对于第二个问题:逗号分隔的标识符
i
child
var
语句的参数。它只声明并初始化
i
,而只声明
child
。问题的第二部分肯定是重复的,不幸的是,因此您应该通过搜索堆栈溢出上的其他IIFE和递归问题来完成您的部分。