来自MDN的IIFE示例-重新引入Javascript页面
下面的代码片段来自MDN,它是对Javascript的重新介绍,应该是为了演示IIFE。我有点明白它应该计算这个文本节点中的字符数,但我不确定有几件事。第一个问题是为什么for语句在第一个参数部分来自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
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和递归问题来完成您的部分。