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函数的实例。是的,这是因为codedocument.getElementById(“thisCall”).onclick=callMe
在onload范围内,函数callMe是在onload范围内定义的。