2013-06-22 42 views
1

我是一位嘗試使用HTML5的古老C程序員,遇到了一些困難。我已經定義了一個全局函數「MouseHandler」,其中包含X和LastMsg這個函數的局部變量。HTML5成員函數中的作用域

函數MoveHandler距離MouseHandler,並放置一個斷點if (PostFunc)我覺得本地變量的值是:

  1. ABCStr是「QQQ」
  2. DefStr是「打倒417358」
  3. LastMsg是 「打倒417358」
  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中,而不是引用(如我所預期的)在外部函數MouseHandler中定義的LastMsg。按照預期,使用引用Mouse.LastMsg似乎引用外層函數的LastMsg的值。

我在這裏錯過了一些明顯的東西嗎?有人可以指示我參考一個HTML5變量範圍的在線參考,它可以爲我澄清這個問題嗎?

+0

JavaScript沒有隱含的聲明,除了在外面嚴格模式在全球範圍內(以嚴格的方式對,這是一個錯誤) –

+0

也許你有某種時間錯誤? –

+0

一些重疊:http://stackoverflow.com/questions/111102/how-do-javascript-closures-work –

回答

2

這些範圍界定問題完全與JavaScript相關,而不是HTML5。

JavaScript的變量作用域雖然看起來與C系列塊作用域相同,但實際上是函數級作用域。 JavaScript將從最裏面的函數開始,向外搜索以「解析」變量,因爲您的MoveHandler()函數中沒有LastMsg的定義,JavaScript將範圍鏈上升到您在MouseHandler變量中定義的匿名函數並在那裏發現並將LastMsg解析爲字符串QQQ

當您在MoveHandler()功能改變的LastMsg值,JavaScript的只是丟棄QQQ值,並創建一個新的字符串,因爲JavaScript字符串是不可變的參考分配給該變量。

良好的鏈接,瞭解這個有:

What is the scope of variables in JavaScript?

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

+0

非常有幫助,謝謝。 –