在javascript中有一个回调函数,函数是一流的对象吗?所以我可以传递一个函数作为一个参数但是如果我通过console.log()它没有工作,为什么它不是一个函数呢?
setTimeout(function(){console.log("hello")},5000);
此代码无效
setTimeout(console.log("hello"),5000);
产生错误,为什么会这样?
答案 0 :(得分:3)
当您使用某个参数调用console.log
时,参数将打印到控制台,函数将返回undefined
。
所以当你这样做时:
setTimeout(console.log("hello"),5000);
"hello"
将被打印,但您实际上在做的是:
setTimeout(undefined, 5000);
在另一个例子(有效)中你创建了一个新函数,但你没有调用它。所以你将这个新函数传递给setTimeout
,这就是它的工作原理。
答案 1 :(得分:2)
以下代码的原因
setTimeout(console.log("hello"),5000);
失败是因为console.log()
直接在setTimeout参数内调用,它总是返回undefined(更多信息:MDN Documentation on Console.log)。这意味着您基本上正在运行setTimeout(undefined,5000);
您需要提供未调用的函数声明。如果将代码包装在函数声明中并且不调用它,则setTimeout将在指定的时间过去后为您调用它。这就是你的第一个语句有效的原因,你提供了一个函数声明:
setTimeout(function(){console.log("hello")},5000);
如果 调用了您在第一个参数中提供的函数,它也会返回undefined,并且会立即输出“hello”。
因此,如果您提供函数声明,它将起作用:
setTimeout(()=>{console.log("hello")},5000);
在没有函数声明的情况下直接使用console.log的另一种方法是将其绑定到变量(更多信息:MDN Documentation on Function.prototype.bind)。使用.bind
原型的示例:
setTimeout(console.log.bind(null,"hello"),5000);
上面的代码将“hello”绑定到console.log的调用。在此示例中,第一个参数为null
,但它是this
上下文。
setTimeout还允许您传递要调用函数的变量。 See MDN Documentation on setTimeout
例如传递一个变量:
setTimeout(console.log,5000,'hello');
在上面的示例中,您告诉setTimeout在5秒内使用'hello'变量(在本例中为sting)调用console.log。
答案 2 :(得分:1)
调用console.log('hello')
将返回undefined
,因此您并没有真正将其传递给setTimeout
,它会打印“hello”但不会在回调中打印。
在大多数情况下,它不会抛出错误(正如您在下面的示例中所见)。
你可以做的是传递console.log
(函数)和3rd argument字符串“hello”。
运行所有3个案例:
setTimeout(console.log("hello"),500);
setTimeout(function(){console.log("hello2")},500);
setTimeout(console.log,500,"hello3");
答案 3 :(得分:0)
它产生错误,因为它评估console.log(...)
,其评估为undefined
,因此不是函数。
答案 4 :(得分:0)
setTimeout接受函数作为参数,而不是函数调用。 console.log()基本上是调用函数/方法,但setTimeout需要引用或更具体地称为回调。
在你的例子中: -
setTimeout(function(){console.log("hello")},5000);
你可以称之为
var callback = function(){console.log("hello")};
setTimeout(callback,5000);
将来稍后将通过setTimeout调用回调。我希望它能清除一切。