未捕获的TypeError:回调时非法调用

时间:2014-08-03 17:53:15

标签: javascript

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 

1 个答案:

答案 0 :(得分:2)

内在事件属性(如onclick)有奇怪的范围规则,我不会假装完全理解。

属性中的

submit是输入所属的表单元素的submit 属性

或者:

  • 明确传递window.submit
  • 将该功能重命名为
  • 使用JavaScript而不是HTML绑定事件处理程序。

我自己去了the latter route一般原则(借此机会停止使用全局变量),并考虑重新命名函数以减少混淆。

<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>