我正在尝试执行以下JavaScript代码,但出现错误。

var services = [{place_id:'okkkkkk'}];
var delay = 100;
var nextAddress = 0;

function theNext() {
  if (nextAddress < services.length) {
    setTimeout('getDetails("' + services[nextAddress].place_id + '", theNext)', delay);
    nextAddress++;
  } else {

  }
}


function getDetails(address, next) {
  alert('ok');
}


theNext();


错误:


  VM687:1未捕获的ReferenceError:未定义getDetails


该函数已定义,我不确定是什么导致了该问题:

https://jsfiddle.net/qmnaykqw/

最佳答案

当您将字符串传递给setTimeout时,它将在全局范围内进行评估。由于getDetails是在另一个函数(至少在您的JSFiddle链接中)(称为onload)中定义的,因此在评估字符串时,它不在范围内。

您需要将函数传递给setTimeout。这将创建一个闭包并保留范围。

function delayed_function() {
    getDetails(services[nextAddress].place_id, theNext);
}

setTimeout(delayed_function, delay);

07-24 21:13