通过字符串调用JavaScript函数失效问题求助
解决JavaScript回调函数触发失败的问题
我明白你遇到的困扰了——想在logMeIn里的两个AJAX请求都完成后,触发一个可变的回调函数,结果通过字符串传递函数名时,却报了window[callBack] is not a function的错误,明明函数确实存在,甚至感觉程序都没尝试调用它。这大概率是作用域问题或者回调传递方式不对导致的,咱们一步步来解决:
为什么传字符串会出错?
你遇到的报错核心原因通常有两个:
- 你的目标函数(比如
likeThisPost)不在全局作用域:如果它是定义在某个闭包、模块或者局部函数内部的,window[callBack]自然找不到它——因为window对象只存储全局作用域下的变量和函数。 - 字符串变量的取值有问题:可能
callBack变量没有正确拿到'likeThisPost'这个字符串,比如拼写错误、大小写不一致,或者变量值被意外修改了。
更靠谱的解决方案:直接传递函数引用
这是JavaScript处理回调的标准做法,既避免了作用域的坑,代码也更清晰易读。直接把函数本身作为参数传入,而不是它的名字字符串:
// 定义你的logMeIn函数,接收回调函数作为参数 function logMeIn(callback) { // 第一个AJAX请求 $.ajax({ url: '/your-first-api', success: function() { // 第一个请求成功后,发起第二个AJAX请求 $.ajax({ url: '/your-second-api', success: function() { // 两个请求都完成后,检查并执行回调 if (typeof callback === 'function') { callback(); // 直接调用传入的函数引用 } else { console.error('传入的参数不是有效的函数'); } }, error: function() { console.log('第二个AJAX请求失败'); } }); }, error: function() { console.log('第一个AJAX请求失败'); } }); } // 你的目标回调函数 function likeThisPost() { console.log('执行likeThisPost函数'); // 这里写你的业务逻辑 } // 调用logMeIn时,直接传入likeThisPost函数本身 logMeIn(likeThisPost);
如果一定要用字符串传递(不推荐,但满足你的原计划)
如果你坚持要通过函数名字符串来实现,那必须确保目标函数在全局作用域下,并且字符串变量的取值完全正确:
// 把likeThisPost挂载到window上,确保它在全局作用域 window.likeThisPost = function() { console.log('执行likeThisPost函数'); }; function logMeIn(callbackName) { // ...两个AJAX请求的逻辑 $.ajax({ url: '/your-first-api', success: function() { $.ajax({ url: '/your-second-api', success: function() { // 检查全局作用域下是否存在该函数 if (typeof window[callbackName] === 'function') { window[callbackName](); } else { console.error(`函数${callbackName}不存在或不是有效的函数`); } } }); } }); } // 调用时传入函数名的字符串 logMeIn('likeThisPost');
额外的排查点
你提到“程序似乎甚至没有尝试去调用它”,可以先做这两个检查:
- 在AJAX的
success回调里加个console.log('两个AJAX请求都完成了'),确认请求真的成功走到了这一步——说不定是AJAX请求失败了,所以根本没触发回调调用。 - 检查
callBack变量的实际值,比如在调用前打印console.log(callBack),确认它确实是'likeThisPost',没有拼写错误。
内容的提问来源于stack exchange,提问作者Sinister Beard
相关产品推荐
相关产品推荐

