var count = 0;
(function curse() {
console.log(++count);
curse();
})();
任何人都可以解释这个功能是如何工作的?你可以看到我已经在其声明中调用了函数,那么为什么它在完成声明之前调用它时没有显示任何错误?虽然我在谷歌控制台尝试它,它循环到无限。我不知道究竟发生了什么以及这段代码如何自行执行,即使我知道javascript中的自执行功能。如果有人解释这个代码,我会很高兴的。提前谢谢
答案 0 :(得分:1)
()();
您创建了一个 IIFE:https://developer.mozilla.org/en-US/docs/Glossary/IIFE
在这种情况下,JavaScript 尝试运行函数,在第一个括号内, 并计算此函数的结果, 并从函数表达式返回这个结果。
(1+2)(); //Uncaught TypeError: 3 is not a function
(function(){ return 1+2; })(); //3
你会得到 3,作为一个整数。
var x = (function(){ return 1+2; })(); //3 returns and write in x;
console.log('x', x); //3
(function curse() {})();
JavaScript 尝试返回函数 curse() 的结果; 此函数的名称在 IIFE 范围内可用(在第一个括号内)。 如果你写:
(function curse() { return 1+2; })();
curse(); //curse is not defined
因此,curses() 仅在第一个括号中可用。
function curse() {
console.log(++count);
curse();
}
所以JavaScript不能返回结果,继续计算这个无穷次;
var count = 0;
(function curse() {
curse();
})();
您将收到错误 Uncaught RangeError: Maximum call stack size exceeded
。
在您的函数中,在第 console.log(++count);
行,
JavaScript 调用 console.log,
然后获取计数变量的值
(它在 function curse
范围内可用,
因为表达式写在这个地方,count 可用于这个地方),
然后增加这个值++
,
显示结果,
并将其保存在变量 count
中。
每次调用命令 console.log(++count);
count
值正在增加,
而是因为没有尽头,所以这个不断增加的无穷大。
你也可以,写下面的代码,
var count = 0;
(function curse() {
setTimeout(
function(){
console.log(++count);
curse();
},1000
)
})();
降低计算能力,看看这是如何工作的。
答案 1 :(得分:0)
var count = 0;
(function curse() {
console.log(++count);
curse();
})();
这可以用分而治之的方法来解释。
1.-解释:
(function someFnc(){})()
<小时/> 当您声明一个函数时,这实际上会返回一个
Function
对象,该对象可以分配给一个变量:
var someFnc = function(){};
之后,您可以对此变量执行某些操作,就像实际调用函数一样:
someFnc();
在你的情况下,你不是将声明的返回值赋给某个变量,而是通过这样做立即调用该函数:
(function foo())();
长话短说,后者将确保在声明后立即调用该函数。
2.- function curse(){ console.log(++count); curse(); }
的解释
++count
只是将变量计数加1,然后在控制台中打印出来。
Recursion
这段代码的第二部分是有趣的部分,是一个自我调用的函数,这个概念是完全有效的,被称为“递归”。
我将使用伪代码解释递归:左
Chain of events:
函数curse
称为
变量计数增加1
变量打印到控制台
函数curse
称为
变量计数增加1
变量打印到控制台
函数curse
称为
变量计数增加1
变量打印到控制台
等等...
希望它有所帮助。
答案 2 :(得分:-3)
您有额外的括号,不需要。
var count = 0;
function curse() {
console.log(++count);
if (curse < 100) {
curse();
}
}