2012-10-31 47 views
1
function onMouseClickFunction() { 

    $mapCanvas.click(function (e) { 
     var x = cursor.getCursorPositionInCanvasX(e.pageX), 
      y = cursor.getCursorPositionInCanvasY(e.pageY); 

什麼是在這個例子中,變量的作用域是它的功能onMouseclickFunction或者是jQuery的的匿名函數?的JavaScript/jQuery的功能範圍

我彪是,JavaScript使用吊裝在其父函數的頂部創建變量,那麼,在這個例子中衝頂做了什麼?

+0

如果提升是你之後,請查看我的答案在這裏:http://stackoverflow.com/questions/9085839/surprised-that-global-variable-has-undefined-value-in-javascript/9085872# 9085872 –

回答

4

假設您的意思是變量xy,那麼它是傳遞給click()的匿名函數。

var總是以當前的函數爲例。

我想說的是,javascript在其父函數的頂部使用提升創建變量,所以在這個例子中吊裝完成了哪裏?

提升意味着當你使用var,變量將作用域的功能,即使您以前試圖使用它。

function() { 
    var x = 1; 

    function() { 
     alert(x); 
     var x = 2; 
    } 
} 

如果內部函數被調用,它會提醒undefined因爲var x = 2會在內部功能範圍的新xvar懸掛),但分配不會發生直到警報之後(因爲任務沒有被吊起)。

所有的問題var語句出現在它們出現在函數的頂部,所以吊裝沒什麼區別。

5

每個變量正確申報將永遠有一個局部範圍的當前功能。

由於您正確使用var聲明,因此您的匿名函數對您的xy變量是本地的。


如果您希望能夠從您的onMouseClickFunction函數訪問這些變量,你必須聲明它們的click事件處理程序之外。您仍然可以通過點擊處理程序訪問它們,因爲該函數本身在onMouseClickFunction函數中聲明。

這就是所謂的JavaScript範圍鏈查找:如果您正在使用的變量尚未在本地範圍內聲明,那麼JavaScript將在當前範圍之上的範圍內查找它(對於您的匿名功能是外onMouseClickFunction)。如果它沒有在那裏被宣佈,那麼它會繼續向上看,直到達到全球範圍。

如果通過作用域鏈的任何地方都沒有找到該變量,則將在全局範圍中聲明爲新變量。這就是爲什麼總是需要聲明您的變量與var聲明,就像你所做的那樣。

0

這將是後者(匿名函數),因爲這是變量被聲明的函數。

0

你在這裏創建的是一個closure

因此,匿名函數會繼承onMouseClickFunction的範圍,但變量x和y只在匿名函數的範圍內。