javascript – 为什么在将函数作为参数传递时我必须省略括号?

前端之家收集整理的这篇文章主要介绍了javascript – 为什么在将函数作为参数传递时我必须省略括号?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图解决为什么下面的代码在包含括号时导致堆栈溢出的原因,但是当它们被省略时则不会.

我将函数本身作为setTimeout的参数调用,它在没有parantheses的情况下工作,但当我添加它们时当然会失败.在函数之后添加()是我的直觉.只希望有人可以为我解决这个问题. parans什么时候可选而不是?

情况1:

  1. var a = 1;
  2.  
  3. function foo() {
  4. a++;
  5. document.write(a);
  6. setTimeout(foo(),2000)
  7. }​
  8. // RangeError: Maximum call stack size exceeded

案例2:

  1. var a = 1;
  2.  
  3. function foo() {
  4. a++;
  5. document.write(a);
  6. setTimeout(foo,2000)
  7. }​
  8. // parens are omitted on foo function and it works.

解决方法

这个问题通常是在引用setTimeout时首先提出的,但我认为重要的是要指出这里的行为并不特定于该函数.您只需要了解括号的作用以及将它们放下的含义.

假设以下功能

  1. function foo() {
  2. return 5;
  3. }

考虑以下两个变量声明/赋值:

  1. var one = foo();
  2. var two = foo;

这些变量有什么价值?

在第一种情况下,我们执行foo函数并将其返回值(数字5)分配给一个.在第二种情况下,我们将foo本身 – 更准确地说是对foo的引用 – 分配给两个.该功能永远不会执行.

有了这些知识,并且理解了setTimeout期望作为第一个参数对函数的引用,那么为什么你的第一个案例失败,但第二个案例失败应该是显而易见的.

当然,你正在执行的函数是对自身的递归调用这一事实加剧了你的问题.这将永远运行 – 对于永远的某些定义 – 因为没有基本情况来终止递归.

猜你在找的JavaScript相关文章