1

以下代码取自“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
&lt;div&gt; container</h1>
            </div>
        </body>
</html>
4

5 回答 5

4

代码是正确的,但没有var关键字也可以工作。

由于e是函数的形式参数(无论是否通过),因此无需声明它var

在 MSIEe上没有传递,因此它被分配了全局window.event对象的值。

请注意,var关键字本身不会覆盖任何现有值,它仅用于在本地范围内声明变量。如果变量已经有一个值,那么“提升”将声明移动到作用域的顶部,但将任何赋值留在原来的位置。

一种更惯用的写法是:

 function getCoords(e) {
     e = e || window.event;
     ...
 }
于 2012-09-25T07:24:57.500 回答
2

是的,您可以删除该函数内的 var 语句。

函数中的变量以两种方式在范围内声明,或者通过“var”关键字,或者通过定义为传递给函数的参数。

于 2012-09-25T07:25:20.867 回答
0

是的,我会删除var,因为它重新定义了已经在同一范围内建立的局部变量(因为它是函数的参数)。

结果应该是相同的,var只是多余的,但它会造成混乱。

另请注意,这var在 Javascript 中有点有趣,因为它出现在函数顶部或其他任何地方都没有关系,它总是会影响整个范围,甚至是它之前的代码:

x = 12;    // using the variable "before" it is declared works
var x = x + 1;

我会在条件块中避免它(因为它太混乱了)。

于 2012-09-25T07:28:22.670 回答
0

var完全没有任何作用,可以在不影响任何浏览器中的任何内容的情况下删除。同名函数参数的存在意味着在局部函数范围内已经定义了一个同名的变量(即使它的值是undefined),在这种情况下var被指定为无操作。

既然如此,我建议将其删除,因为它的存在只会引起混乱。

于 2012-09-25T09:23:24.300 回答
-1

省略 var 关键字时,将在全局范围内创建变量。因此,当您在这种情况下省略 var 关键字时,您会创建一个全局变量 e,它可以被任何其他 javascript 函数读取和更改。考虑到“e”是一个非常常见的标识符,这可能会导致一些非常意想不到的错误。

通常,您应该始终使用 var 关键字。

于 2012-09-25T07:26:02.723 回答