在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的明确和有用的答案.
如果没有做太多,那就没有太大的区别了.匿名函数将使用比单独函数少得多的内存量.
原因是单独的函数声明将基本上用作指针,因此可以重用它.但是,每次都需要构建匿名函数.这是一个非常小的差异.
基本的区别在于范围和参数.您不能将参数传递给函数指针.超时内的函数是否需要与其父级共享范围?如果是这样,那么匿名函数可能比另一个范围中的声明函数更有价值.一个常见的是传入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.
| 归档时间: |
|
| 查看次数: |
2926 次 |
| 最近记录: |