以下代码取自“JavaScript by Example Second Edition”。
我认为代码
if (!e) var e = window.event; // Internet Explorer
应该是
if (!e) e = window.event; // Internet Explorer
你怎么看?这样对吗?或者代码应该保持不变?
<html>
<head>
<title>Mouse Coordinates</title>
<script type="text/javascript">
function getCoords(e) {
var x = 0; // x and y positions
var y = 0;
if (!e) var e = window.event; // Internet Explorer
if (e.pageX || e.pageY) { // Firefox
x = e.pageX;
y = e.pageY;
}
else if (e.clientX || e.clientY) {
x = e.clientX + document.body.scrollLeft
+ document.documentElement.scrollLeft;
y = e.clientY + document.body.scrollTop
+ document.documentElement.scrollTop;
}
// x and y contain the mouse position
// relative to the document
alert(x + ", " + y);
}
</script>
</head>
<body>
<div style="background-color: aqua; position: absolute; top: 50px"
onmouseover="return getCoords(event);">
<h1>Mouse positions are relative to the document, not the
<div> container</h1>
</div>
</body>
</html>
答案 0 :(得分:4)
代码是正确的,但也可以在没有var
关键字的情况下运行。
由于e
是函数的形式参数(无论是否通过),因此无需声明它var
。
在MSIE上e
未通过,因此会为其分配全局window.event
对象的值。
请注意,var
关键字本身不会覆盖任何现有值,它仅用于声明本地范围内的变量。如果变量已经有一个值,那么“hoisting”会将声明移动到作用域的顶部,但会保留任何指定的位置。
更为惯用的写作方式是:
function getCoords(e) {
e = e || window.event;
...
}
答案 1 :(得分:2)
是的,您可以删除该函数中的var语句。
函数中的变量以两种方式在范围内声明,可以通过'var'关键字,也可以定义为传递给函数的参数。
答案 2 :(得分:0)
是的,我放弃var
,因为它重新定义了已在同一范围内建立的局部变量(因为它是函数的参数)。
结果应该是相同的,var
只是多余的,但会造成混淆。
另请注意var
在Javascript中有点滑稽,因为如果它出现在函数顶部或其他任何地方都无关紧要,它将始终影响整个范围,甚至代码之前< / em> it:
x = 12; // using the variable "before" it is declared works
var x = x + 1;
我会在条件块中避免它(因为它太混乱了)。
答案 3 :(得分:0)
var
正在执行任何操作,可以删除而不会影响任何浏览器中的任何内容。存在具有相同名称的函数参数意味着已在本地函数范围中定义了该名称的变量(即使其值为undefined
),在这种情况下var
被指定为无操作。
在所有情况下,我建议删除它,因为它的存在只会引起混淆。
答案 4 :(得分:-1)
省略var关键字时,变量在全局范围内创建。因此,当您在这种情况下省略var关键字时,您将创建一个全局变量e,可以通过任何其他javascript函数读取和更改该变量。考虑到“e”是一个非常常见的标识符,这可能会导致一些非常意外的错误。
通常,您应该始终使用var关键字。