未捕获的类型错误:回调时的非法调用
Uncaught TypeError: Illegal invocation on callback
function submit() {
console.log('Submit!');
}
function foo(callback, param) {
console.log(callback);
// ... //
callback(param); // <-- Script fails here
}
<input type="button" onclick="foo(submit)">
为什么不工作?
function submit() { [native code] } foo.js:241
Uncaught TypeError: Illegal invocation
内部事件属性(如onclick
)有奇怪的作用域规则,我不会假装完全理解。
属性中的submit
是输入所属表单元素的submit
属性。
:
- 显式传递
window.submit
- 将函数重命名为或
- 用JavaScript而不是HTML绑定你的事件处理程序。
根据一般原则,我自己会选择后一种方法(抓住机会停止使用全局变量),并考虑重命名函数以尽量减少混淆。
<input type="button">
<script>
// Scoping IIFE omitted from this simplified example
var button = document.getElementsByTagName('button')[0];
button.addEventListener("click", function () { foo(submit); });
function submit // etc etc
</script>
相关文章:
- AngularJS:我可以跳过函数参数回调吗
- 要求未定义JS回调参数
- MeteorJS:在带有回调的vzaar api上正确使用wrapAsync
- 自引用回调
- 测试Angular Service解决错误回调中的promise
- 如何将一个JavaScript函数回调为多个函数
- JavaScript回调函数
- 用于回调的javascript参数
- 将json回调数据转换为日期
- 承诺在非节点式回调上使用Bluebird
- 如何在回调函数中执行流
- 回调函数中传递参数的困难(Google Map API Markers)
- Soundcloud Javascript SDK 3.0-回调无法读取属性'connectCallback
- 如何使用jqueryAJAX从页面中回调多个变量
- jquery Onclick函数带有导致双击的回调排序函数
- Javascript点击事件回调不起作用
- window.print作为直接jquery回调-非法调用
- gap.client.load未调用回调:在console.log中指定了一个无效或非法的字符串
- 未捕获的类型错误:回调时的非法调用
- 在非法广播回调中接收错误