我是一名古老的C程序员,试图使用HTML5,但有些困难。我已经定义了一个全局函数“MouseHandler”,该函数包含该函数的局部变量,包括X和LastMsg。
一个函数MoveHandler在MouseHandler中,并在if (PostFunc)
放置一个断点我找到了局部变量的值:
代码是:
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的变量范围的在线参考,这将为我澄清这个问题吗?
答案 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?