1

我是一位尝试使用 HTML5 的古老 C 程序员,但遇到了一些困难。我已经定义了一个全局函数“MouseHandler”,其中包含该函数的本地变量,包括 X 和 LastMsg。

一个函数 MoveHandler 在 MouseHandler 中,并在if (PostFunc)我发现局部变量的值是一个断点:

  1. ABCStr 是“QQQ”
  2. DefStr 为“下跌 417,358”
  3. LastMsg 是“下跌 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 似乎是内部 MoveHandler 中的一个(隐式声明的)局部变量,而不是(如我所料)定义的 LastMsg在外部函数 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 回答