Javascript HTML5成员函数中的作用域

Javascript HTML5成员函数中的作用域,javascript,html,function,variables,scope,Javascript,Html,Function,Variables,Scope,我是一个尝试使用HTML5的古老的C程序员,有点困难。我定义了一个全局函数“MouseHandler”,其中包含该函数的局部变量,包括X和LastMsg MouseHandler中有一个函数MoveHandler,在if(PostFunc)I处放置一个断点,我发现局部变量的值为: ABCStr是“QQQ” DefStr为“下降417358” LastMsg是“下降417358” Mouse.LastMsg是“QQQ” X是417 LocalX是417 代码是: var MouseHandler

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

MouseHandler中有一个函数MoveHandler,在
if(PostFunc)
I处放置一个断点,我发现局部变量的值为:

  • ABCStr是“QQQ”
  • DefStr为“下降417358”
  • LastMsg是“下降417358”
  • Mouse.LastMsg是“QQQ”
  • X是417
  • 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中的一个(隐式声明的)局部变量,而不是引用(正如我所预期的)外部函数MouseHandler中定义的LastMsg。正如预期的那样,使用reference Mouse.LastMsg似乎引用了外部函数的LastMsg的值


    我是不是漏掉了什么明显的东西?有人能告诉我HTML5变量范围的在线参考资料吗?这将为我澄清这个问题。

    这些范围界定问题完全与JavaScript有关,与HTML5无关

    JavaScript的变量作用域虽然看起来与C族块作用域相同,但实际上是函数级作用域。JavaScript将从最里面的函数开始,向外搜索以“解析”变量,因此因为在
    MoveHandler()
    函数中没有
    LastMsg
    的定义,JavaScript沿着作用域链向上到达您在
    MouseHandler
    变量中定义的匿名函数,并在那里找到
    LastMsg
    并解析为字符串
    QQQ

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

    有关这方面的好链接有:


    Javascript没有隐式声明,除非在严格模式之外的全局范围(如果启用严格模式,则为错误)。也许您有某种计时错误?有些与:Jan重叠-谢谢。没有直接回答我的问题,但我学到了更多关于严格的模式和范围规则的知识,这些规则使我走上了正确的道路。马克-你的也有同样的帮助。