setTimeout传递了命名函数与匿名函数

max*_*nan 8 javascript

MDN页面上,window.setTimeout我找到了一个将命名函数传递给window.setTimeout的示例:

var timeoutID;

function delayedAlert() {
  timeoutID = window.setTimeout(slowAlert, 2000);
}

function slowAlert() {
  alert("That was really slow!");
}

function clearAlert() {
  window.clearTimeout(timeoutID);
}
Run Code Online (Sandbox Code Playgroud)

在我维护的代码中,我遇到了这个示例的等价物,其中声明了一个匿名函数,因为它被传递给window.setTimeout:

var timeoutID;

function delayedAlert() {
  timeoutID = window.setTimeout(function(){
    alert("That was really slow!");
  }, 2000);
}

function clearAlert() {
  window.clearTimeout(timeoutID);
}
Run Code Online (Sandbox Code Playgroud)

这两种延迟警报的方式之间是否有重要区别?我比我正在使用的代码更信任MDN,所以我想理解为什么MDN使用单独的函数声明来表达他们的示例.

编辑:谢谢@TravisJ @jfriend00 @PlatinumAzure的明确和有用的答案.

Tra*_*s J 7

如果没有做太多,那就没有太大的区别了.匿名函数将使用比单独函数少得多的内存量.

原因是单独的函数声明将基本上用作指针,因此可以重用它.但是,每次都需要构建匿名函数.这是一个非常小的差异.

基本的区别在于范围和参数.您不能将参数传递给函数指针.超时内的函数是否需要与其父级共享范围?如果是这样,那么匿名函数可能比另一个范围中的声明函数更有价值.一个常见的是传入this.

var that = this;
window.setTimeout(function(){
 //keep in mind this anonymous function's `this` will be window
 showAlert(that.message);
},2000;
Run Code Online (Sandbox Code Playgroud)

为了传递消息,例如,如果您的警报是,function showAlert(msg)那么您将需要使用匿名函数window.setTimeout(function(){showAlert("hello");}, 2000);.

你真正想避免使用的是那里的一个字符串.如

window.setTimeout("slowAlert()", 2000);
Run Code Online (Sandbox Code Playgroud)

这被认为是不好的做法,因为函数将基于类似于使用的字符串构造eval.