回调在JavaScript中是如何工作的?

回调在JavaScript中是如何工作的?,javascript,Javascript,我在我的代码中遇到了一个例子,它让我重新访问Javascript中的回调,我一直对此感到不安 示例:我需要函数“type”在函数“erase”之前执行并完成。我可以在类型中添加一些计时器以确保结束,但我想找到更好的方法 挖掘类型: function type() { captionEl.html(caption.substr(0, captionLength++)); if(captionLength < caption.length+1) { setTim

我在我的代码中遇到了一个例子,它让我重新访问Javascript中的回调,我一直对此感到不安

示例:我需要函数“type”在函数“erase”之前执行并完成。我可以在类型中添加一些计时器以确保结束,但我想找到更好的方法

挖掘类型:

function type() {
    captionEl.html(caption.substr(0, captionLength++));
    if(captionLength < caption.length+1) {
        setTimeout('type()', 50);
    } else {
        captionLength = 0;
        caption = '';
    }
}
函数类型(){
html(caption.substr(0,captionLength++);
if(标题长度<标题长度+1){
setTimeout('type()',50);
}否则{
captionLength=0;
标题='';
}
}
函数直到caption=“”(nothing”)-我希望看到erase()运行时才结束


那么,我是否将callback作为类型中的一个参数传递(比如type(callback)),然后在caption设置为nothing的情况下执行callback?但是我如何“测试”type函数以使caption设置为“”?

如果
类型
完成后总是调用
擦除
,您不需要回调,只需要正常的函数调用:

function type() {
  captionEl.html(caption.substr(0, captionLength++));
  if(captionLength < caption.length+1) {
    setTimeout(type, 50);
  } else {
    captionLength = 0;
    caption = '';
    erase();
  }
}

type();

A只是一个在变量中传递的函数。JavaScript具有,这意味着它们可以作为参数传递,也可以由其他函数返回。在更彻底地解释回调方面做得相当好。

如果您的代码以正确的格式在旧计算机上执行,则每50毫秒,类型函数称为w这意味着递归函数调用。这是一种锁定旧计算机的好方法。除非您更好地检查输入字符串。@迈克:这不是递归的,是计划好的。而且,每50毫秒也不会降低奔腾3在200 MHz或更高频率下运行的速度(即使在IE5上).在133MHz的机器上,你可能会注意到速度变慢。我知道这一点,因为早在2001-2002年我就编写过这样的web应用程序(当时他们称它们为dhtml,而不是web应用程序)我的工作站是200MHz Pentium3,而我的笔记本电脑是133MHz Pentium2。你说的“测试”是什么意思?你到底想在这里测试什么?是的,将回调作为参数传递是一种方法。另一种方法是使用承诺。@SamuelLiew:“…这会导致它立即启动。””“那不是真的。它在全局范围内执行,但不会立即执行。不要传递
setTimeout
字符串,只需传递对
type
的引用:
setTimeout(type,50)
。隐式地使用一个字符串
eval
s,不必要地减慢速度,它相当于
setTimeout(eval('type()'),50)
function type(callback) {
  captionEl.html(caption.substr(0, captionLength++));
  if(captionLength < caption.length+1) {
    setTimeout(type, 50);
  } else {
    captionLength = 0;
    caption = '';
    callback();
  }
}

type(erase);

// somewhere later in the code it does something else after type is done
type(duplicate);