自包含函数如何在javascript中工作?

时间:2018-02-01 23:01:08

标签: javascript

var count = 0;
(function curse() {
  console.log(++count);
  curse();
})();

任何人都可以解释这个功能是如何工作的?你可以看到我已经在其声明中调用了函数,那么为什么它在完成声明之前调用它时没有显示任何错误?虽然我在谷歌控制台尝试它,它循环到无限。我不知道究竟发生了什么以及这段代码如何自行执行,即使我知道javascript中的自执行功能。如果有人解释这个代码,我会很高兴的。提前谢谢

3 个答案:

答案 0 :(得分:1)

  1. 如果你写:
()();

您创建了一个 IIFE:https://developer.mozilla.org/en-US/docs/Glossary/IIFE

在这种情况下,JavaScript 尝试运行函数,在第一个括号内, 并计算此函数的结果, 并从函数表达式返回这个结果。

  1. 如果你在第一个括号里写一些表达式,你会得到一个错误:
(1+2)(); //Uncaught TypeError: 3 is not a function
  1. 如果你写:
(function(){ return 1+2; })(); //3

你会得到 3,作为一个整数。

  1. 如果你写:
var x = (function(){ return 1+2; })(); //3 returns and write in x;
console.log('x', x); //3
  1. 接下来,您的函数已命名。 如果你写:
(function curse() {})();

JavaScript 尝试返回函数 curse() 的结果; 此函数的名称在 IIFE 范围内可用(在第一个括号内)。 如果你写:

(function curse() { return 1+2; })();
curse(); //curse is not defined

因此,curses() 仅在第一个括号中可用。

  1. 此函数是递归的,并且不会返回结果:
function curse() {
  console.log(++count);
  curse();
}

所以JavaScript不能返回结果,继续计算这个无穷次;

  1. 如果你这样写,没有console.log(这个操作需要一些时间):
var count = 0;
(function curse() {
  curse();
})();

您将收到错误 Uncaught RangeError: Maximum call stack size exceeded

  1. 在您的函数中,在第 console.log(++count); 行, JavaScript 调用 console.log, 然后获取计数变量的值 (它在 function curse 范围内可用, 因为表达式写在这个地方,count 可用于这个地方), 然后增加这个值++, 显示结果, 并将其保存在变量 count 中。 每次调用命令 console.log(++count); count 值正在增加, 而是因为没有尽头,所以这个不断增加的无穷大。

  2. 你也可以,写下面的代码,

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();
   }
}