【问题标题】:Why callback function gets called even though I never invoked?为什么即使我从未调用过回调函数也会被调用?
【发布时间】:2021-04-16 23:49:56
【问题描述】:

我想知道为什么这个简单的回调函数 (setTimout) 会被调用,即使我没有调用而是分配它。

在这段代码中,我将 setTimeout 函数分配给变量 foo。

所以我认为返回值应该存储在变量 foo 中

而且它不需要执行和打印'hello',因为我没有调用那个函数。

但是为什么它被调用并打印'hello'?如果我只想将其分配并存储到变量怎么办?

还有这个函数怎么可以是数字类型,返回值为2??

const foo = setTimeout(() => console.log('hello'), 2000);
// hello ( after 2 seconds )

console.log(typeof foo);
// number

console.log(foo);
// 2

提前致谢

【问题讨论】:

标签: javascript callback settimeout


【解决方案1】:

setTimeout 调用它。这就是为什么它被称为回调。 “invoke”的另一个更常见的词是“call”,所以回调基本上是一个回调:稍后有人会调用你的代码。

这是一个接受回调的代码示例:

function foo (cb) {
   // this function prints "foo" if callback returns true

   if (cb()) { // foo() invoking cb()!

      console.log('foo');

   }
}

如您所见,编写函数的程序员是调用/调用您的函数的人。你只需要定义他们要调用的函数:

foo(function() { return true })

【讨论】:

    【解决方案2】:

    将其声明为稍后调用的函数:

    const foo = function () {
        setTimeout(() => console.log('hello'), 2000);
    }
    

    setTimeout 的返回值是一个整数 Id,表示超时时间,后面可以和 clearTimeout() 一起使用;

    例如

    var t = setTimeout(() => console.log('hello'), 2000);
    // clear the time out
    clearTimeout(t);
    

    【讨论】:

    • 注意setTimeout的返回值是超时的id。在大多数浏览器中,它通常实现为数字,但不一定是数字。例如 Node.js 返回一个表示超时的复杂对象
    【解决方案3】:

    你刚刚调用了带有两个参数的函数并存储了setTimeout的返回结果

    const foo = setTimeout(() => console.log('hello'), 2000);//
    

    示例: 我有一个函数 setTimeout1

    function setTimeout1(parm1, parm2){
      // do somthing
      return "Invoked";
    }
    
    const foo = setTimeout1(() => console.log('hello'), 2000);
    

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      相关资源
      最近更新 更多