未捕获的类型错误:lang 不是一个函数



在我的HTML中,我在script标签中定义了lang函数,并添加了"Test Fire!"按钮,该按钮必须在单击时调用lang

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Testing Functions</title>
  <script type="text/javascript">
    function lang() {
      alert("Hello, World! It's JavaScript this time");
    }
  </script>
</head>
<body>
  <form action="">
    <input type="button" value="Test Fire!" onclick="lang();">
  </form>
</body>
</html>

但是,如果我单击该按钮,则会收到此错误:

未捕获的类型错误:lang不是函数

但是,如果我将函数名称从 lang 更改为其他任何内容,则此代码可以正常工作。

请考虑以下代码:

<input type="button" value="Debugger Test" onclick="debugger;" />
<input type="button" value="Prototype Test" onclick="console.log(__proto__);" />

当你点击"调试器测试"并打开你的调试器时,你会看到似乎有一个隐含的with范围包裹在onclick周围,使得所有<input>的属性都可以访问,而无需引用按钮。

单击"原型测试"会记录当前示波器的原型。你会看到它是HTMLInputElement的原型,使得整个原型链的所有可复制属性都可用于示波器。

有趣的是,当前HTMLDocument的原型链的可复制部分也包括在内。

所有这些都意味着所有全局属性(lang是其中之一)和特定于按钮的其他几个属性都被覆盖。 例如 valuetype也行不通。类似地,像createElement(来自document)这样的变量也不起作用,但不可理解的append(来自ParentNode.prototype)会起作用。

所有这些在回答有关全局变量与window属性冲突的相关问题时也进行了解释。


最好的办法是使用添加事件侦听器的标准方式:addEventListener

<input type="button" value="Test" />
<script>
  function lang() {
    alert("Hello, World! It’s not an HTML event handler attribute this time");
  }
  document.querySelector("input").addEventListener("click", lang);
</script>

没有理由复杂化(我真的不知道为什么它不起作用),但您可以使用:

  • 直接在输入中添加警报。

结果:https://jsfiddle.net/cmedina/h4m1qcoq/6/

将侦听器添加到输入

function lang() {
   alert("Hello, World! It's JavaScript this time");
}
document.getElementById('test').onclick = lang

结果:https://jsfiddle.net/cmedina/h4m1qcoq/7/

最新更新