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

On MSIEeは渡されないため、window.event代わりにグローバル オブジェクトの値が割り当てられます。

varキーワード自体は既存の値を上書きしないことに注意してください。ローカル スコープで変数を宣言するだけです。変数がすでに値を持っている場合、「ホイスト」は宣言をスコープの先頭に移動しますが、割り当ては元の場所に残します。

これを書くより慣用的な方法は次のとおりです。

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

はい、その関数内の var ステートメントを削除できます。

関数内の変数は、「var」キーワードを使用するか、関数に渡されるパラメーターとして定義されるという 2 つの方法でスコープ内で宣言されます。

于 2012-09-25T07:25:20.867 に答える
0

それvarはまったく何もしていないので、どのブラウザにも影響を与えることなく削除できます。同じ名前の関数パラメーターが存在するということは、その名前の変数が既にローカル関数スコープで定義されていることを意味し (その値が であってもundefined)、その場合varは no-op として指定されます。

そのような場合は、存在すると混乱を招くだけなので、削除することをお勧めします。

于 2012-09-25T09:23:24.300 に答える
-1

var キーワードを省略すると、変数はグローバル スコープで作成されます。したがって、この場合に var キーワードを省略すると、グローバル変数 e が作成されます。この変数は、他の JavaScript 関数で読み取って変更できます。「e」が非常に一般的な識別子であることを考えると、これは非常に予期しないバグにつながる可能性があります。

一般に、常に var キーワードを使用する必要があります。

于 2012-09-25T07:26:02.723 に答える