1
 function onMouseClickFunction() {

    $mapCanvas.click(function (e) {
        var x = cursor.getCursorPositionInCanvasX(e.pageX),
            y = cursor.getCursorPositionInCanvasY(e.pageY);

この例の変数スコープは何ですか?それは関数onMouseclickFunctionまたはおそらくjqueryの無名関数ですか?

javascriptは、親関数の上部に変数を作成するホイストを使用しているので、この例ではどこでホイストが実行されますか?

4

4 に答える 4

5

適切に宣言されたすべての変数は、常に現在の関数へのローカルスコープを持ちます。

varステートメントを適切に使用しているため、変数xy変数は無名関数に対してローカルです。


関数からこれらの変数にアクセスできるようにする場合は、イベントハンドラーonMouseClickFunctionの外部でそれらを宣言する必要があります。clickその関数自体が関数内で宣言されているため、クリックハンドラー内から引き続きそれらにアクセスできますonMouseClickFunction

これはJavaScriptのスコープチェーンルックアップと呼ばれます。使用している変数がローカルスコープ内で宣言されていない場合、JavaScriptは現在のスコープのすぐ上のスコープでその変数を検索します(無名関数の場合は外部です)onMouseClickFunction)。ここでも宣言されていない場合は、グローバルスコープに到達するまで、スコープ全体を調べ続けます。

変数がスコープチェーンのどこにも見つからない場合は、グローバルスコープで新しい変数として宣言されます。そのため、これまでと同様に、常にvarステートメントを使用して変数を宣言することが不可欠です。

于 2012-10-31T14:37:43.570 に答える
4

あなたが変数xとを意味すると仮定するとy、それはに渡される無名関数click()です。

var常に現在の関数をスコープします。

javascriptは、親関数の上部に変数を作成するホイストを使用しているので、この例ではどこでホイストが実行されますか?

巻き上げとは、を使用するvarと、以前に使用を試みた場合でも、変数のスコープが関数に適用されることを意味します。

すなわち

function () {
    var x = 1;

    function () {
         alert(x);
         var x = 2;
    }
}

内部関数が呼び出された場合、内部関数のスコープに新しいものが作成されるundefinedため(吊り上げられます)、アラートが発生しますが、割り当てはアラートが終了するまで行われません(割り当てが引き上げられていないため)。var x = 2xvar

質問のすべてのvarステートメントは、それらが表示される関数の上部に表示されるため、巻き上げしても違いはありません。

于 2012-10-31T14:38:14.623 に答える
0

ここで作成したのはクロージャーです。

そのため、無名関数はonMouseClickFunctionのスコープを継承しますが、変数xとyは無名関数のスコープ内にのみ存在します。

于 2012-10-31T14:43:58.417 に答える
0

後者(無名関数)は、変数が宣言されている関数であるためです。

于 2012-10-31T14:38:55.750 に答える