javascript中的onclick in window.onload

javascript中的onclick in window.onload,javascript,Javascript,考虑一下这个片段: <head> <script> window.onload = function(){ function callMe(){ alert("Inside the function"); this.value = "New Value";

考虑一下这个片段:

    <head>      
        <script>
            window.onload = function(){
                function callMe(){
                    alert("Inside the function");
                    this.value = "New Value";                   
                }
                document.getElementById("thisCall").onclick = callMe;
            }
        </script>       
    </head>
    <body>          
        <input type="submit" id="thisCall" />   
    </body>

window.onload=函数(){
函数callMe(){
警报(“功能内部”);
this.value=“新值”;
}
document.getElementById(“thisCall”).onclick=callMe;
}
上述操作与预期一样正常,按钮文本从Submit更改为新值

但是如果我稍微修改一下,下面的代码段为什么不起作用呢

        <script>
            window.onload = function(){
                function callMe(){
                    alert("Inside the function");
                    this.value = "New Value";                   
                }
                //document.getElementById("thisCall").onclick = callMe;
            }
        </script>

    </head>
    <body>          
        <input type="submit" id="thisCall" onclick="callMe();"/>        
    </body>


window.onload=函数(){
函数callMe(){
警报(“功能内部”);
this.value=“新值”;
}
//document.getElementById(“thisCall”).onclick=callMe;
}
我不明白为什么

未捕获引用错误:未定义callMe


o/p在控制台上吗?

这是由于范围的原因。您的函数仅存在于分配给window.onload方法的匿名函数的范围内。该匿名方法知道该方法,因为它是在其作用域中定义的,可以调用它,但该作用域之外的任何东西都不能调用它


这有意义吗?

函数声明会创建一个指向当前范围内函数的变量

在JavaScript中,每个函数都创建一个新的作用域

您正在分配给
onload
的匿名函数范围内创建
callMe
。这不是一个全球性的问题


onclick
事件处理程序不在上述匿名函数的作用域内,因此无法访问该变量

您的问题是
callMe()
函数声明在onload范围内,因此它是本地的,并且只在这个范围内可见

您必须将其放置在外部,这样它将是一个全局函数,并且可以在外部看到并从外部访问:

function callMe(){
     alert("Inside the function");
     this.value = "New Value";                   
}


window.onload = function(){
      callMe();  
      document.getElementById("thisCall").onclick = callMe;
}
编辑:

该代码:

document.getElementById("thisCall").onclick = callMe;
正在工作,因为它写在onload函数范围内,函数
callMe
是在该范围内定义的


如果将它与
onclick
属性一起使用,它将不起作用,因为就像前面所说的
callMe()
在全局范围内不可识别,这就是为什么在全局范围内未定义
callMe的原因。

因为只有在onload函数声明的范围内才知道callMe。这意味着我需要移动函数callMe()在第二种情况下退出onload函数。最好完全避免第二种情况,不要使用
onclick
属性。最好避免使用全局<最好避免使用带
的代码>(并且
onclick
属性在内部实现
宽度
)。最好避免混合使用JS和HTML。我发现只有在使用document.getElementById(“thisCall”).onclick=callMe时,按钮文本才会更改;因为在just callMe()的情况下,这指的是callMe函数的实例,我还没有创建任何callMe函数的实例。是的,这是因为code
document.getElementById(“thisCall”).onclick=callMe
在onload范围内,函数callMe是在onload范围内定义的。