"明确"是Javascript中的保留字吗?

Unc*_*nny 35 javascript

我花了很长时间搞清楚我不应该使用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>
Run Code Online (Sandbox Code Playgroud)

这是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";
}
Run Code Online (Sandbox Code Playgroud)

症状:单击"添加"和"检查"按钮可以得到我期望的结果,但单击"清除"按钮不会执行任何操作.

如果我将clear()重命名为clearxyz(),它可以正常工作.

我的问题:

  1. "明确"是一个保留字吗?我没有在列表中看到它:https: //developer.mozilla.org/en/JavaScript/Reference/Reserved_Words
  2. 是否有一个调试技巧,我将来会用它来解决这类问题?我花了很长时间(我是一个菜鸟!)来弄清楚功能的名称是我的问题.

非常感谢.编辑:我正在使用Firefox 6.0,我添加了换行符以显示Array.js的启动位置.

Fel*_*ing 35

正如有人说,clear不是保留关键字.似乎被调用的函数是document.clear [MDN].调用

console.log(clear === document.clear);
Run Code Online (Sandbox Code Playgroud)

在事件处理程序内部返回true.

DEMO

所以看来,document是在事件处理程序的范围链中......现在的问题是为什么.

JavaScript:权威指南说:

在作为HTML属性的事件处理程序中,Document对象位于Window对象(...)之前的作用域链中

由于您的方法是全局的,意味着它是window对象的属性,因此在范围链中找不到它,就像document.clear在范围链中更早出现的那样.

我没有找到任何规范.该指南还说,不应该依赖于此,所以我认为这不是官方的.

如果表单中有表单元素,那么即使相应的form元素也会在作用域链中(不确定这是否适用于所有浏览器).这是混淆的另一个原因.


有两种(非排他性)方法可以避免这种情况:

  • 不要使用内联事件处理程序.它被认为是不好的做法,因为它混合了逻辑和表示.还有其他 方法可以附加事件处理程序.

  • 不要污染全局命名空间.在全局范围内创建一个对象(您确定的名称不会与任何windowdocumentHTML元素的属性或ID 冲突)并将这些函数指定为此对象的属性.无论何时调用函数,都可以通过此对象引用它.还有其他方法可以命名代码.

  • ...有趣的是你可以在内联时从`getElementById`这样的调用中消除`document. (6认同)

Ori*_*iol 6

不,clear不是保留关键字。

问题是,由于您使用事件处理程序内容属性,因此您的全局函数window.clear被过时的document.clear.

此行为在获取事件处理程序的当前值步骤 10中进行了解释:

词汇环境范围

  1. 如果H是元素的事件处理程序,则令Scope为 NewObjectEnvironment(文档全局环境)的结果。

    否则,HWindow对象的事件处理程序:令 Scope全局环境

  2. 如果表单所有者不为空,则令Scope为 NewObjectEnvironment(表单所有者,范围)的结果。

  3. 如果element不为 null,则令Scope为 NewObjectEnvironment( element, Scope )的结果。

注意: NewObjectEnvironment() 在 ECMAScript 第 5 版第 10.2.2.3 节 NewObjectEnvironment (O, E)中定义

这意味着全局范围被

  1. 该文件
  2. 表单所有者(如果有)
  3. 元素

因此,您可以