是";清晰的;Javascript中的保留字?
我花了很长时间才弄明白我不应该在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!</bu
<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
的函数似乎工作得很好。正如其他人所说,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(){
清除();
}
函数检查(){
结果。