Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 调用回调时出现未捕获的TypeError_Javascript_Ajax_Xmlhttprequest_Onreadystatechange - Fatal编程技术网

Javascript 调用回调时出现未捕获的TypeError

Javascript 调用回调时出现未捕获的TypeError,javascript,ajax,xmlhttprequest,onreadystatechange,Javascript,Ajax,Xmlhttprequest,Onreadystatechange,我有一个错误,我自己设法解决了。有人能给我解释一下为什么我的代码不起作用,以及是什么导致了它 代码如下: var listTables = function (tables) { console.log(tables); } var ajaxReq = function (success_cb, url) { // success_cb can be invoked here without errors var http = new XMLHttpRequest(); htt

我有一个错误,我自己设法解决了。有人能给我解释一下为什么我的代码不起作用,以及是什么导致了它

代码如下:

var listTables = function (tables) {
  console.log(tables);
}

var ajaxReq = function (success_cb, url) {
  // success_cb can be invoked here without errors
  var http = new XMLHttpRequest();
  http.onreadystatechange = function (success_cb) {
    if (this.readyState == 4 && this.status == 200) {
      success_cb(this); // Uncaught TypeError: success_cb is not a function
    }
  }
  http.open("GET", url, true);
  http.send();
}
ajaxReq(listTables, "http://www.someurl.com");

当我从
onreadystatechange
函数定义中删除
success\u cb
回调时,代码工作正常。这是一个与作用域相关的问题吗?

错误在于您在内部函数中重复了
success\u cb
作为参数:

var ajaxReq = function (success_cb, url) { // First time success_cb parameter is used: correct.
  var http = new XMLHttpRequest();
  http.onreadystatechange = function (success_cb) { // Second time: wrong!
    // ...
  }
  // ...
}
这会产生两种意想不到的效果:

  • 它盖过了您最初的(第一个)
    success\u cb
    ,因此无法再访问它
  • 相反,它将
    readystatechange
    事件的事件参数指定给作为对象的
    success\u cb
“”表示提供的同名变量(或参数)的作用域比上一个变量(或参数)的作用域更近

因此,只需删除第二个用法:

var listTables = function (tables) {
  console.log(tables);
}

var ajaxReq = function (success_cb, url) {
  // success_cb can be invoked here without errors
  var http = new XMLHttpRequest();
  http.onreadystatechange = function () {
    if (this.readyState == 4 && this.status == 200) {
      success_cb(this);
    }
  }
  http.open("GET", url, true);
  http.send();
}
ajaxReq(listTables, "http://www.someurl.com");

您不需要在内部函数中将
success\u cb
作为参数重复。这样做将通过
readystatechange
事件的事件参数覆盖原始的
success\u cb
。您可以演示如何使用ajaxReq@Xufox不,我没有。不是在我的电脑自动取款机上,所以用我的电话。因此,糟糕的格式被纠正了。@MattSugden。现在看看。如果这真的修复了您的代码,那么这无疑是一个范围问题。您需要发布实际的完整代码以进行验证。