這是一個範圍界定問題。當您在$(document).ready
函數中定義變量(或對象,如函數)時,它們是臨時的。
var x = 1;
var y;
$(document).ready(function() {
var x= 'a billiondy'; //does not affect the global variable
y=2;
z=3;
window.a = 4;
});
此時window
有3個變量,x
,y
,並a
其是等於1,2和4分別。
因爲x
被重新聲明爲var
,所以不會被覆蓋(它只是一個局部變量)。
由於y
在window
中定義,範圍鏈找到y並假定您的意思是window.y
。
因爲z
是null
(從未聲明)ready函數現在聲明瞭一個局部變量。當就緒功能關閉時,z
不在任何活動範圍內引用,因此它被垃圾收集。
同樣的事情發生在a
,但它不是垃圾收集,因爲你明確地說「這是一個窗口變量」。因此a
在全球範圍內定義。得到它了?
編輯:這是更多的答案比你想要的,但瞭解這一點很重要。在某些時候,你會問「爲什麼這樣和那樣的變量被覆蓋/未定義」。答案在範圍鏈中。
第二個編輯:
要回答安德烈的問題(見註釋),下面的代碼是無效的:
function testFunction(){ mySecondFunction(); } //ran first
$(document).ready(function(){ // ran third;
window.mySecondFunction = function(){alert("this will work");}
});
testFunction(); // ran second
的原因是,準備函數內部的代碼運行後,其他的一切都是裝。所以當testFunction運行時(最後一行),mySecondFunction沒有定義。它基本上,如果你試過你會犯同樣的錯誤:
function test() { test2() };
function test2() {alert('wtf?')};
未就緒功能的任何代碼獲取就緒功能的任何代碼之前執行。但是,在文檔加載後(以及已啓動的就緒函數)執行的任何代碼都可以訪問mySecondFunction,因爲它現在已在窗口範圍中定義。考慮以下。
function testFunction(){ mySecondFunction(); }
$(document).ready(function(){
window.mySecondFunction = function(){alert("this will work");}
});
//testFunction(); erroneous do not uncomment!
$(document).click(function() {testFunction();}); //works fine
//$("body").click(function() {testFunction();}); //does nothing
如果您點擊文檔,您在ready函數執行後單擊,因此未註釋的行可以正常工作。它後面的行不做任何事情(如果這是在<head>
標籤),因爲在這一點上沒有正文,所以$("body")
返回一個空的jQuery列表。 javascript的年代表與範圍幾乎一樣令人困惑。
在調試javascript時,確保你有什麼東西可以顯示任何JS錯誤。 Firebug是一個不錯的選擇(只適合全面的Web開發)。我很肯定你會得到一個testFunction不是一個函數類型的錯誤,它可能幫助你縮小了問題的範圍。 – nzifnab 2011-03-08 20:47:38
是的,我做了,不知道如何解決它。 – Andre 2011-03-08 22:16:49