2014-05-21 58 views
0

在這個jsfiddle中,如果你點擊矩形,你會看到「Hello」警告,但是變量x屬於函數f(),而不是事件處理函數mousedown。這段代碼是否正確?JavaScript和Raphael中的函數和事件

的HTML:

<div id="canvas"></div> 

和JavaScript:

var paper = Raphael("canvas", 600, 600); 

    var r = paper.rect(100,100, 200,200); 

    r.attr({ "fill" : "#000000"}); 

    f(); 

    function f(){ 

     var x = "Hello"; 

     r.mousedown(function(e) { 
      alert (x); 
     }); 

    } 

回答

0

我不太清楚你的問題,但肯定的,鼠標按下功能可以看到在父函數聲明的變量因爲javascript支持詞法分析範​​圍:也就是說,變量的範圍是由它在源代碼中的位置定義的。

Javascript支持閉包的概念。 「閉包中定義的函數」記住了「創建環境」。有效地,mousedown函數包含對函數f()中聲明的變量x的引用。

如果你是從一個具有塊範圍的語言開始,這可能會讓你感到困惑。

,如果你要改變你的函數f()讀取:

function f() { 
    var x = "Hello"; 
    r.mousedown(function(e) { 
     alert(x); 
    }); 
    x = "Goodbye"; 
} 

點擊矩形將顯示「再見」 - 變量x的鼠標按下功能看到的是,這是f中聲明() ;

更多信息:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures