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。现在看看。如果这真的修复了您的代码,那么这无疑是一个范围问题。您需要发布实际的完整代码以进行验证。