“clear”在Javascript中是保留字吗?

“clear”在Javascript中是保留字吗?,javascript,Javascript,我花了很长时间才弄明白我不应该在Javascript中使用clear作为函数名: <head> <script type="text/javascript" src="Array.js"></script> </head> <body> Hello!!!!<br> <button type="button" onClick="clear()" id="ppp">Shoo!</butt

我花了很长时间才弄明白我不应该在Javascript中使用clear作为函数名:

<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>
症状:单击“添加”和“检查”按钮可以得到我期望的结果,但单击“清除”按钮没有任何作用

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

我的问题是:

clear是保留字吗?我在清单上没有看到: 是否有一个调试技巧我应该用来计算这种 将来会发生什么事?我花了很长时间,我是个笨蛋!到 找出函数名是我的问题。 非常感谢。 编辑:我使用的是Firefox 6.0,我添加了一个换行符来显示Array.js的起始位置。

不是根据

编辑:

你让我好奇,所以我凑在一起

拥有一个名为clear的函数似乎工作得很好。

正如其他人所说,clear不是一个保留关键字。似乎被调用的函数是。援引

console.log(clear === document.clear);
在事件处理程序内部,返回true

看起来,文档位于事件处理程序的作用域链中。。。。现在的问题是为什么

说:

在作为HTML属性的事件处理程序中,文档对象位于窗口对象之前的范围链中

由于您的方法是全局的,这意味着它是窗口对象的一个属性,因此在范围链中找不到它,因为document.clear在范围链的前面

我还没有找到这个的任何规格。指南还说,人们不应该依赖于此,因此我认为这不是官方的说法

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

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

不要使用内联事件处理程序。这被认为是一种糟糕的做法,因为它混合了逻辑和表达。没有附加事件处理程序的方法

不要污染全局名称空间。在全局范围内创建一个对象,该对象的名称确保不会与任何窗口或文档属性或HTML元素的ID冲突,并将函数指定为该对象的属性。无论何时调用函数,都要通过此对象引用它。还可以为代码命名名称空间


好问题。我认为这个问题是一个范围问题——您的onClick=clear不适用于您定义的clear函数,但我不确定它的用途。将其更改为window.clear或只调用clear的新函数

否,clear不是保留关键字

问题是,由于使用了,全局函数window.clear被过时的

此行为的解释如下所示:

词汇环境范围

如果H是元素的,那么让作用域成为全局环境NewObjectEnvironmentdocument的结果

否则,H是对象的:let 范围是全球环境

如果表单所有者不为null,则将作用域设为NewObjectEnvironmentform所有者、作用域的结果

如果元素不为null,则让Scope作为NewObjectEnvironmentelement的结果,Scope

注意:NewObjectEnvironment在ECMAScript edition 5部分中定义

这意味着全局范围被

文件 表格所有者(如有) 元素 因此,你可以

重命名你的函数

函数clear_{document.body.style.background='green';}
点击我你是说这个吗@罗伯特,如果我试图用一个已经使用过的名称创建一个新函数,难道我不应该得到某种错误吗?这很容易测试。@Vinny叔叔:不会产生错误。Javascript允许您使用其他变量对变量进行阴影处理。我想我需要更多地了解阴影处理的工作原理。在我看来,这又一次,作为一个noob,要求明确是模棱两可的;Javascript如何知道/决定调用selection.clear而不是我的clear?是的,这就是OP在他的问题中链接到的页面。哈哈…是的。不知怎的,我第一次回答这个问题时就错过了。你的JSFIDLE是不同的。它通过向函数传递引用来附加事件处理程序。问题是OP使用的是一个内联事件处理程序,它有一个特定的作用域链,我们必须找出其中的一个。这很有帮助,有点让人恼火/困惑。我想我也需要学习更多关于范围的知识!我仍然想找到一种方法来避免将来使用其他保留字时出现这个问题。@叔叔:clear不是保留字。这是一个范围问题。@patrickdw:谢谢。。。你在评论中提到这件事,实际上是给了我一个暗示。。。我有点觉得我偷了你的主意;哦,你很快就会收到我的账单;实际上,我正准备发布一个arguments.callee===document.clear答案,但后来我看到了你的,你也有范围解释,所以我想说你把它从公园里打出来了……有趣的是,你可以删除这个文档。F
rom在内联时调用getElementById。虽然使用动态添加的侦听器修复了OPs问题,但指出必须注意函数名也很重要。window对象有大量默认属性,因此具有诸如clear、add和check等通用名称的全局函数比具有诸如clearForm或clearInput等更具体名称的全局函数更容易发生冲突,或者不管函数的实际用途是什么。与合适的名称空间或前缀结合使用,冲突的可能性可以降低到接近零。
function clear() {
    alert("you cleared just fine");
}

$('clear').addEvent('click', clear);
console.log(clear === document.clear);
<body>
    Hello!!!!<br>
    <button type="button" onClick="clear()" id="ppp">Shoo!</button><br>
    <button type="button" onClick="window.clear()" id="ppp">window.clear!</button><br>
    <button type="button" onClick="clear2()" id="ppp">clear2!</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">
    var results;

function initialize(){
 results = document.getElementById("results");
}

function add() {
results.firstChild.data="add";    
}

function clear() {
results.firstChild.data = "Hello";
}

function clear2() {
clear();
}

function check() {
results.firstChild.data = "check";
}
initialize();
    </script>
</body>