2009-09-24 46 views
0

我只是想知道是什麼這兩個是什麼具有Jquery.Document功能,而不是讓它在

File1.js 
$(function() 
{ 
    function MyFunction() 
    { 
     // some code here 
    } 
}); 

File2.js 

$(function() 
{ 
     // call it. 
     MyFunction(); 
}); 

File1.js 
function MyFunction() 
{ 
     // some code here 
} 


File2.js 

$(function() 
{ 
     // call it. 
     MyFunction(); 
}); 

之間的差別那麼有什麼不同區別?當我做第一種方法時,我試圖從File2.js中調用MyFunction(),但它從未工作。我將我的函數移出了File1.Js中準備好的Jquery.Document,並且工作正常。

我有一些在File1中的其他功能,即使它們在文檔中,File1中的任何東西都可以稱之爲沒有問題。

它只是看起來像在跨腳本文件,它有一個問題調用函數時設置的方式。

回答

2

在ECMAScript中有只有功能(沒有塊範圍)範圍,以及任何與「變種」或「功能」關鍵字在函數中定義不會是範圍以外訪問(除非你把它分配給什麼從外部範圍如窗口)。您在另一個函數中定義了一個函數,並且根據函數範圍規則,您無法訪問它。

但是,您可以可以訪問在外部作用域上定義的變量/函數,這是您在第二個示例上所做的。

因此,當你是$(function(){})'ing時,你正在做的是創建一個沙箱,一個限制區域,如果你定義了任何變量,除非你明確地指定它們是屬性類似於窗口對象,這是全局命名空間。

+0

啊好吧我懷疑它與範圍有關,但不知道爲什麼。在Javascript文件中找出範圍似乎很難。由於像你可以在10個不同的腳本中有10個不同的函數,並且如果它們全部被引用,第11個腳本可以訪問它們。但是像C#這樣的東西,你將不得不創建一個新類的對象來訪問它們(除非它是一個靜態方法)。 – chobo2 2009-09-24 03:16:34

+0

這也讓我想知道當我在同一頁面上引用了2個腳本,並且每個腳本都有一個具有相同名稱的函數,並且它們從不發生衝突。所以我猜想,因爲它是在「沙箱」這就是它爲什麼從來沒有衝突。 – chobo2 2009-09-24 03:18:11

+0

我猜如果他們在$(function(){})以外的地方會有衝突嗎? – chobo2 2009-09-24 03:19:33

1

我相信這個問題是由於額外的「$();」包裝該函數會創建一種閉包,從而導致有限的範圍。