1

私は古代の C プログラマーで、HTML5 を使用しようとしていますが、多少の困難があります。X と LastMsg を含むその関数にローカルな変数を使用して、グローバル関数「MouseHandler」を定義しました。

関数 MoveHandler は MouseHandler 内にあり、ブレークポイントを配置するif (PostFunc)と、ローカル変数の値は次のようになります。

  1. ABCStr は「QQQ」です
  2. DefStrは「ダウン417,358」
  3. LastMsg は「Down 417,358」です
  4. Mouse.LastMsg は「QQQ」
  5. X は 417
  6. LocalX は 417 です

コードは次のとおりです。

var MouseHandler = function (canvas1,   terraincvs1,    PostFunc1)
{
    //  ...
    var X,  Y;
    var LastMsg =   "QQQ";

    //  ...

    function    MoveHandler ()
    {
        var ABCStr      =   Mouse.LastMsg;
        var DEFStr      =   LastMsg;
        var LocalX      =   X;

        //  ...

        LastMsg =   "Move " + X + ',' + Y;

        if  (PostFunc)
            PostFunc    ();
        return      {   "LastMsg"   :   LastMsg     }
    }

    cvs.addEventListener("mousedown", DownListener, false);

    return  { "DownListener" : DownListener, "UpListener" : UpListener, "MoveHandler"  : MoveHandler,
            "OffsetX" : OffsetX, "OffsetY" : OffsetY, "dX" : dX, "dY" : dY, "DownX" : DownX, "DownY" : DownY, "Down" : Down,
            "LastMsg" : LastMsg }
}


//  ...

var Mouse   =   new MouseHandler    (canvas, HexCanvas, PostMouse);

LocalX は、外部関数 MouseHandler 内で定義された "X" の値に適切に設定されているようですが、LastMsg は、定義された LastMsg を参照するのではなく、(予想どおり) 内部 MoveHandler 内の (暗黙的に宣言された) ローカル変数のようです。外部関数 MouseHandler 内。参照の使用 Mouse.LastMsg は、予想どおり、外部関数の LastMsg の値を参照しているように見えます。

ここで明らかな何かが欠けていますか?この問題を明確にしてくれる HTML5 の変数のスコープに関するオンライン リファレンスを教えてもらえますか?

4

1 に答える 1

2

これらのスコープの問題は完全に JavaScript に関連しており、HTML5 にはあまり関連していません。

JavaScript の変数スコープは、C ファミリのブロック スコープと同じように見えますが、実際には関数レベルのスコープです。LastMsgJavaScript は最も内側の関数から開始し、変数を「解決」するために外側に検索します。そのため、関数内にの定義がなかったためMoveHandler()、JavaScript は変数内で定義した無名関数までスコープ チェーンを上っていき、MouseHandlerそこにが見つかりLastMsg、文字列に解決されましたQQQ

LastMsg関数での値を変更するとMoveHandler()、JavaScript は単純にQQQ値を破棄して新しい文字列を作成し、その参照をその変数に割り当てます。これは、JavaScript 文字列が不変であるためです。

これについて読むための良いリンクは次のとおりです。

JavaScript のスコープと巻き上げ

JavaScript の変数のスコープとは何ですか?

JavaScript 文字列は不変ですか? JavaScript で「文字列ビルダー」が必要ですか?

于 2013-06-22T18:49:23.440 に答える