HTML5成员函数中的范围

时间:2013-06-22 18:14:23

标签: javascript html5 function variables scope

我是一名古老的C程序员,试图使用HTML5,但有些困难。我已经定义了一个全局函数“MouseHandler”,该函数包含该函数的局部变量,包括X和LastMsg。

一个函数MoveHandler在MouseHandler中,并在if (PostFunc)放置一个断点我找到了局部变量的值:

  1. ABCStr是“QQQ”
  2. DefStr是“Down 417,358”
  3. LastMsg是“Down 417,358”
  4. Mouse.LastMsg是“QQQ”
  5. X是417
  6. LocalX是417
  7. 代码是:

    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中的(隐式声明的)局部变量,而不是引用(如我所料)在外部函数MouseHandler中定义的LastMsg。使用引用Mouse.LastMsg似乎是指外部函数的LastMsg的值,如预期的那样。

    我错过了一些明显的东西吗?有人可以引导我参考HTML5的变量范围的在线参考,这将为我澄清这个问题吗?

1 个答案:

答案 0 :(得分:2)

这些范围问题与JavaScript完全相关,而不是HTML5。

JavaScript的变量范围虽然看起来与C系列块范围相同,但实际上是功能级范围。 JavaScript将从最里面的函数开始并向外搜索以“解析”变量,因为您的LastMsg函数中没有MoveHandler()的定义,JavaScript将范围链上升到匿名函数您在MouseHandler变量中定义的内容,并在其中找到并解析LastMsg到字符串QQQ

当你在LastMsg函数中更改MoveHandler()的值时,JavaScript只会丢弃QQQ值并创建一个新字符串并将其引用分配给该变量,因为JavaScript字符串是< I>不可变的

阅读相关内容的好链接是:

JavaScript Scoping and Hoisting

What is the scope of variables in JavaScript?

Are JavaScript strings immutable? Do I need a "string builder" in JavaScript?