我只是花了很长时间才弄清楚我不应该使用 clear() 作为 Javascript 中的函数的名称:
<head>
<script type="text/javascript" src="Array.js"></script>
</head>
<body>
Hello!!!!<br>
<button type="button" onClick="clear()" id="ppp">Shoo!</button><br>
<button type="button" onClick="add()" id="add">Add a few elements</button><br>
<button type="button" onClick="check()" id="check">Check the array</button><br>
<p id="results">Results will appear here.</p>
<script type="text/javascript">
initialize();
</script>
</body>
这是 Array.js:
var results;
function initialize(){
results = document.getElementById("results");
}
function add() {
results.firstChild.data="add";
}
function clear() {
results.firstChild.data = "Hello?";
}
function check() {
results.firstChild.data = "check";
}
症状:单击“添加”和“检查”按钮会得到我期望的结果,但单击“清除”按钮什么也没做。
如果我将 clear() 重命名为 clearxyz(),它可以正常工作。
我的问题:
- “明确”是保留字吗?我没有在列表中看到它: https://developer.mozilla.org/en/JavaScript/Reference/Reserved_Words
- 有没有我应该使用的调试技巧来解决这种问题 以后有事吗?我花了很长时间(我是菜鸟!) 弄清楚函数的名称是我的问题。
非常感谢。 编辑:我使用的是 Firefox 6.0,我添加了换行符以显示 Array.js 的开始位置。
最佳答案
正如其他人所说,clear
不是保留关键字。好像调用的函数是document.clear
[MDN] .调用
console.log(clear === document.clear);
事件处理程序内部返回 true
。
看来,document
在事件处理程序的作用域链中....现在的问题是为什么。
JavaScript: The Definitive Guide说:
In an event handler as HTML attribute, the Document object is in the scope chain before the Window object (...)
由于您的方法是全局的,这意味着它是 window
对象的属性,因此在作用域链中找不到它,因为 document.clear
在作用域链。
我还没有找到这方面的任何规范。该指南还说人们不应该依赖它,所以我认为这不是官方的。
如果表单中有表单元素,那么即使是相应的 form
元素也会在作用域链中(不确定这是否适用于所有浏览器)。这是造成混淆的另一个原因。
有两种(并非唯一的)方法可以避免这种情况:
不要污染全局命名空间。在全局范围内创建一个对象(使用您确定不会与任何
window
或document
HTML 元素的属性或 id)并将函数分配为该对象的属性。每当你调用一个函数时,你都是通过这个对象来引用它的。还有other ways为您的代码命名空间。
关于javascript - "clear"是 Javascript 中的保留字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7165570/