2010-09-30 168 views
1

對不起,但我如何訪問myFunction() from somefunction()?Javascript範圍問題

<script> 
$(document).ready(function() { 
    // Get messages 
    var myFunction = function() { 
     // doSth. 
    } 

    // Make the initial call on page load. 
    myFunction(); 
); 

function someFunction() { 
    // Call the function a second time 
    myFunction(); // Call fails! 
} 
</script> 

回答

1

它更多的是範圍問題。是的,你是範圍界定匿名功能,但即使你把它的全球去除這樣的變種:

$(document).ready(function() { 
    // gets defined AFTER THE DOM IS READY 
    myFunction = function() { 
     // doSth. 
    } 
} 

// is called BEFORE THE DOM IS READY 
myFunction(); 

它仍然無法正常工作,由於myFunction沒有被調用時定義someFunction。 someFunction在文檔準備好之前立即運行,這是在定義myFunction之前。

這兩個函數都需要在文檔就緒區塊中,或者在文檔就緒區塊之外。如果你需要操縱DOM元素,我會在裏面推薦。

如果someFunction被稱爲一個處理程序,您可以從myFunction刪除var聲明中,就如預期,因爲這將使myFunction在全球範圍內。

+0

someFunction不會立即運行。這只是一個函數聲明。 – 2010-09-30 11:07:39

+1

直到文檔就緒事件被觸發,myFunction將不會被創建。在文檔就緒事件被觸發之前,最後一次調用myFunction時會被觸發,所以即使您在全局名稱空間中聲明它,調用也會失敗 – 2010-09-30 11:39:41

4

你就劃定範圍,以你傳遞給ready方法匿名函數。只需將該功能外的定義移動即可。

+0

當然。謝謝。 – fabian 2010-09-30 11:04:23

0

我認爲你不能用你當前的代碼調用myfunction()。你將不得不從document.ready().得到function() { var myfunction = ... };分離方法,然後你可以調用myFunction。

1

我不認爲這會起作用,因爲直到dom準備就緒並且文檔'ready'事件被觸發,'myFunction'函數將不會被創建。第二次調用'myFunction'發生在'myFunction'創建之前。即使您在全局命名空間中創建函數「myFunction」,這種情況也會失敗。

如果您沒有在'myFunction'中使用任何閉包值,則可以將此函數移至全局名稱空間。這將解決你的問題。 例如:

var myFunction = function(){ 
    //Do somthing 
} 

$(document).ready(function(){ 
    myFunction(); 
}); 


myFunction()