2012-09-19 77 views
2

我試圖從外部訪問變量MYVAR像這樣:如何從匿名鼠標事件函數中訪問變量?

$(document).mousemove(function(e){ 
    var myvar = winHeight() + scrollY() - e.pageY; 
}); 
console.log(myvar); 

但Chrome的JavaScript控制檯口口聲聲說「未捕獲的ReferenceError:MYVAR沒有定義的所有產品:203 (匿名函數)」

我在做什麼錯?如何在這個函數之外訪問這個變量?

編輯:我意識到,我試圖做的是不可實現的。我已經完全改變了我的策略,現在代碼運行良好。 (謝謝James,尤其是Vlad的幫助!)

回答

2

我認爲這是一個JavaScript事件的工作。基本上你有一個全局變量,它將在鼠標移動時更新。更新變量後,您必須讓其他組件知道變量已準備好進行處理。

的代碼:

var myVar; // the global variable 

// the function that will be caled when myVar has been changed 
var myVarChangedHandler = function() { 
    console.log('myVar variable has been changed: ' + myVar); 
} 

// bind the event to the above event handler 
$('body').bind('MyVarChangedEvent', myVarChangedHandler); 

// instal mouse move event handler on document 
$(document).mousemove(function(e){ 
    myVar = winHeight() + scrollY() - e.pageY; 
    $('body').trigger('MyVarChangedEvent'); 
}); 

UPDATE

刪除了關鍵字var形成movemove事件處理程序。

取決於myVar的代碼應放在myVarChangedHandler函數中。

我會盡力解釋你的代碼, 中的缺陷以及你應該如何用類比解決問題。 讓我們下面的代碼(修正全局變量)

var myvar; 
$(document).mousemove(function(e){ 
    myvar = winHeight() + scrollY() - e.pageY; 
}); 
console.log(myvar); 

比方說,你,程序員,都在一些不知名的公司網絡開發部 一個團隊的領導者,你有任務列表中做工作了一天( 我們比喻的任務是更新myvar每次鼠標移動) 您在您的處置庫(var myvar)和2個開發商:

  • 開發商約翰(function(e) { myVar = ... };
  • 開發商肯(console.log(myvar)

09:00你來辦公室在早上(用戶打開頁面)

09:05您接通服務器電源/存儲庫

var myvar; 

09:10你告訴約翰: 約翰,請做這個任務,每次你完成每個任務 上傳到版本庫,並在你的小時完成後回家

$(document).mousemove(function(e){ 
    myvar = winHeight() + scrollY() - e.pageY; 
});   

09:11你告訴肯: 肯,請現在測試資源庫中的代碼後,你回家 已完成測試

console.log(myvar); 

(此時,肯看到的是,倉庫是空的,回家 - 這是因爲 約翰沒有來得及在一分鐘內解決甚至任務,使肯無關的測試)

09:12你回家

09:12在辦公室只有約翰在做這些工作,你和肯已經離開了家裏 因爲你沒有別的事情要做。 這也發生在您的代碼中。你輸出的myvar價值,但你還沒有移動鼠標 等等,當然,這個值是undefined

爲了解決這個問題,我們添加了一些修改:

09:00你來辦公室早上

09:05您接通服務器電源(資料庫)

09:10你告訴約翰:

John, please do this tasks and everytime you complete each task 
uploaded it to the repository and tell Ken to test the code. 
Go home after you have finished 

09:11你告訴肯:

Ken, each time John tells you that he has completed a task, 
fetch the code from the repository and test it. 
Go home after he has finished 

09:12你回家

在09:12兩個約翰和肯是在辦公室做他們的工作。

在上述情況下,Ken是myVarChangedHandler = function() {...};

當約翰告訴肯,他完成了一個真實的事件發生時的任務(故事), 當肯acknowleges他開始測試約翰信號(Ken是事件處理程序)

這是javascript中事件驅動架構的工作原理。 我會建議你溝jquery,mootools等......並開始學習核心概念 和基礎知識。重新啓動車輪幾次然後回到jquery。 我希望我解釋得足夠讓你理解。

+0

這並沒有工作,要麼..給我的錯誤消息「myVar的變量已經改變:未定義」(儘管我糾正你的拼寫錯誤第13行) –

+0

myVar的@MoRamzan我複製粘貼代碼,忘了刪除var關鍵字在鼠標移動事件處理程序。我更新了答案。再次嘗試 –

+0

這似乎是工作,還是一點沒有讓我進入** ** myVar的變量外要做到這一點,下面的「這是一個外部的變化:」文本。應該更新... http://jsfiddle.net/MoRamzan/Q9NBQ/4/ –

2

您需要將變量移動到可以通過兩位代碼訪問的外部作用域。

var myvar = -1; 

$(document).mousemove(function(e){ 
    myvar = winHeight() + scrollY() - e.pageY; 
}); 

console.log(myvar); 
+0

如果我這樣做,我不會收到錯誤消息。但是隨着鼠標移動,** myvar **不會更新。如果我把控制檯聲明放在函數中,那麼我確實得到了輸出,但我想在外面訪問它...... –

+0

你確定你的代碼和上面一樣嗎?假設'mousemove'代碼正常工作,這將起作用。確保你從處理程序中刪除了'var'聲明。 –

+0

這是我的代碼:var myvar = -1; \t(文檔)$ .mousemove(函數(e)中{ \t \t MYVAR = winHeight()+ scrollY() - e.pageY; \t}); \t console.log(myvar); –