在我的 HTML 中我定义了lang
函数在script
标签并添加“试射!”必须调用的按钮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
的原型,使所有scopable https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/unscopables整个原型链的属性可供该范围使用。
有趣的是,当前原型链的范围部分HTMLDocument
也包括在内。
所有这一切意味着所有全局属性(lang
是其中之一),并且其他几个特定于按钮的按钮被覆盖。例如。value
, type
也不行。同样,变量如createElement
(from document
) 也行不通,但是不可作用域append
(from ParentNode.prototype
) would.
这一切也都在这篇文章中得到了解释回答相关问题 https://stackoverflow.com/a/51062916/4642212关于全局变量与冲突window
特性。
最好的选择是使用添加事件侦听器的标准方法:addEventListener https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Inline_event_handlers_%E2%80%94_don't_use_these.
<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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)