为什么console.log不能作为参数?

时间:2018-06-05 21:05:24

标签: javascript

在javascript中有一个回调函数,函数是一流的对象吗?所以我可以传递一个函数作为一个参数但是如果我通过console.log()它没有工作,为什么它不是一个函数呢?

setTimeout(function(){console.log("hello")},5000);

此代码无效

setTimeout(console.log("hello"),5000);

产生错误,为什么会这样?

5 个答案:

答案 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调用回调。我希望它能清除一切。