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

IT技术 javascript typeerror
2021-03-08 14:52:03

在我的 HTML 中,我langscript标签中定义了函数并添加了“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为其他任何内容,则此代码可以正常工作。

2个回答

考虑这个代码:

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

当您单击“Debugger Test”并打开您的调试器时,您会看到似乎有一个隐式with作用域包裹在 周围onclick,从而<input>无需引用按钮即可访问所有的属性。

单击“Prototype Test”记录当前范围的原型。您将看到它是HTMLInputElement的原型,使整个原型链的所有可作用域属性都可用于作用域。

有趣的是,当前原型链的范围部分HTMLDocument也包括在内。

所有这一切意味着所有全局属性(lang是其中之一)和其他几个特定于按钮的属性都被覆盖。例如valuetype也行不通。同样,像createElement(from document)这样的变量也不起作用,但不可分范围的append(from 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>

@RichardBarker 我不是在答案中写过吗?使用addEventListener或者使用任何不是全局属性的函数名称,也不是您正在使用的元素的任何属性或属性名称onclick(祝你每次都能猜到好运)。只要坚持现代标准 ( addEventListener),您通常会遇到更少的麻烦。
2021-04-25 14:52:03
@SanyamMishra好吧,与其他浏览器相比,IE显然没有将代码包装onclick在隐式with范围内。
2021-04-27 14:52:03
@SpencerWieczorek 这三个浏览器似乎都是这种情况。这个问题对我来说也是新的。我不确定这是否是一个指定的和记录在案的功能......至少对于 Firefox,这似乎与怪癖模式无关。
2021-05-15 14:52:03
@RichardBarker 这很可能是一个设计决定。onclick无论如何不鼓励使用该属性。
2021-05-18 14:52:03
所以我假设 Firefox 和 Chrome 都有这个with范围,而 IE 没有?
2021-05-19 14:52:03

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

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

结果: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/

@SanyamMishra 然后添加侦听器按钮我的第二个选项!
2021-04-28 14:52:03
我在这里的目的不是生成警报。我只是说明调用“lang()”不起作用。
2021-05-15 14:52:03