setTimeout 回调参数

IT技术 javascript
2021-03-15 20:06:16

让我们考虑一下这段 JavaScript:

function Person(name) {
    this.name = name;
}

Person.prototype.showName = function() {
    alert(this.name);
}


var mike = new Person("mike");
//mike.showName();  

window.name = "window"; 

我不明白行为之间的区别

setTimeout(mike.showName(), 5000);

setTimeout(function(){
    mike.showName();
}, 5000);

为什么行为不同?这真的让我很困惑。谢谢。

4个回答

你的问题真的有什么都没有setTimeout您只需要了解函数调用和对函数的引用之间的区别。

考虑这四个任务:

var one = function() { mike.showName(); };
var two = mike.showName;
var three = mike.showName();
var four = (function() { mike.showName(); })();

前两个将函数的引用分配给它们各自的变量。然而,最后两个调用函数(这就是括号的用途)并将它们的返回值分配给左侧的 vars。

这与 setTimeout 有何关系:

setTimeout函数期望作为第一个参数一个参考到的函数,因此任一onetwo以上将是正确,但threefour不会。但是,重要的是要注意,严格来说,将函数的返回值传递给并不是错误setTimeout,尽管您会经常看到这样说。

这完全没问题,例如:

function makeTimeoutFunc(param) {
    return function() {
        // does something with param
    }
}

setTimeout(makeTimeoutFunc(), 5000);

它与如何 setTimeout接收函数作为其参数无关,但它确实

非常感谢人。你的回答很棒。但是我仍然有一个困惑。你能告诉我为什么 'mike.showName()' 会先执行而 'function(){ mike.showName()' 等待 5 秒吗?再次感谢。
2021-05-04 20:06:16
@jsnewman - Passingmike.showName()表示立即运行该函数showName并将它返回的任何内容作为回调传递,以在 5 秒内执行(这没什么)。但是,传递function(){ mike.showName() }提供setTimeout了一个匿名函数,从现在开始运行五秒钟。五秒钟过去了,外部包装函数被执行。它包含一行,即对 的调用showName,该调用在当时执行。
2021-05-14 20:06:16

如果接受的答案太长而无法阅读:

setTimeout(mike.showName(), 5000);

这将执行5,000 毫秒后mike.showName() 返回的任何内容

setTimeout(function(){ mike.showName(); }, 5000);

这将后5000毫秒调用执行匿名函数mike.showName()实际功能

实现相同效果的另一种方法:

setTimeout(mike.showName.bind(mike), 5000);

这不是性能问题。您展示的其中一种方法根本不起作用(它立即调用该函数,而不是在超时触发时调用)。

setTimeout(mike.showName(), 5000);将执行该showName函数并将其返回值设置为不起作用的超时回调。

setTimeout(function(){ mike.showName(); }, 5000);创建一个匿名函数并将其设置为超时回调。当超时触发时,将调用该函数并调用您的showName()函数。

仅供参考,setTimeout('mike.showName();', 5000);也可以。但是不要那样做——这和使用eval(). 除此之外,它会使您的代码可读性降低,因为字符串中的代码不能以语法高亮显示。

你能告诉我为什么 'mike.showName()' 会先执行而 'function(){ mike.showName()' 等待它的时间吗?非常感谢。
2021-04-21 20:06:16
因为您实际上在该行中调用了该函数。如果你将它包装在一个匿名函数中,或者只是传递函数而不()调用它 - 传递函数本身。
2021-04-23 20:06:16

setTimeout(mike.showName(), 5000);mike.showName()立即执行并将返回值传递给setTimeout()

setTimeout(function(){ mike.showName(); }, 5000);而是传递一个指向该函数的指针。这样setTimeout就可以执行函数,而不是它的返回值。