是";清晰的;Javascript中的保留字?

是";清晰的;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!</bu

我花了很长时间才弄明白我不应该在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
    的函数似乎工作得很好。

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

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

    因此,
    文档
    似乎位于事件处理程序的作用域链中。。。。现在的问题是为什么

    说:

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

    由于您的方法是全局的,这意味着它是
    窗口
    对象的一个属性,因此在范围链中找不到它,正如
    文档一样。清除
    位于范围链的前面

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

    如果表单中有表单元素,那么即使是相应的
    form
    元素也将位于范围链中(但不确定这是否适用于所有浏览器)。这是造成混乱的另一个原因


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

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

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


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

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

    因此,
    文档
    似乎位于事件处理程序的作用域链中。。。。现在的问题是为什么

    说:

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

    由于您的方法是全局的,这意味着它是
    窗口
    对象的一个属性,因此在范围链中找不到它,正如
    文档一样。清除
    位于范围链的前面

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

    如果表单中有表单元素,那么即使是相应的
    form
    元素也将位于范围链中(但不确定这是否适用于所有浏览器)。这是造成混乱的另一个原因


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

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

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


      • 问得好。我认为这个问题是一个范围问题-您的
        onClick=“clear()”
        不会指向您定义的
        clear
        函数,但我不确定它将指向何处。将其更改为
        window.clear()
        或一个只调用
        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>
        
        
        你好

        窗户,让开
        clear2
        添加一些元素
        检查阵列

        结果将显示在此处

        var结果; 函数初始化(){ 结果=document.getElementById(“结果”); } 函数add(){ results.firstChild.data=“添加”; } 函数clear(){ results.firstChild.data=“Hello”; } 函数clear2(){ 清除(); } 函数检查(){ results.firstChild.data=“检查”; } 初始化();
        问得好。我认为这个问题是一个范围问题-您的
        onClick=“clear()”
        不会指向您定义的
        clear
        函数,但我不确定它将指向何处。将其更改为
        window.clear()
        或一个只调用
        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>
        
        
        你好

        窗户,让开
        clear2
        添加一些元素
        检查阵列

        结果将显示在此处

        var结果; 函数初始化(){ 结果=document.getElementById(“结果”); } 函数add(){ results.firstChild.data=“添加”; } 函数clear(){ results.firstChild.data=“Hello”; } 函数clear2(){ 清除(); } 函数检查(){ 结果。