[英]Accessing a function defined inside a function from the global scope?
長話短說,我有一個使用jQuery的長代碼。 許多文件,函數等。我們的用戶數量少於理想的用戶,我們的代碼有問題,因為安裝了一些插件,工具欄等會破壞我們的JavaScript代碼,這是因為jQuery被兩次包含在內,並且令人討厭。
我以為我可以
。
(function($) {
// All of my code goes here.
})(jQuery);
我尚未檢查是否可以解決這些用戶的問題,但確實可以。 問題是,在網站的一部分(圖像上傳)中,我們有一個iframe,它需要調用在我們的大部分代碼中定義的某些函數。 我嘗試過將這些函數從這個未命名的函數調用中刪除,但是它本身使用了必須存在的其他函數。
關於如何能夠從其外部的代碼訪問該函數內部定義的函數(如上所示)的任何想法或解決方法?
謝謝!
為什么要在對jQuery函數對象的調用中包裝代碼,並將其傳遞給自執行的匿名函數; 您是要從所有代碼中創建jQuery對象嗎?
為了將代碼公開給外界,您需要將函數和對象分配給代碼范圍之外的對象,例如window對象。
例如,如果您創建了一個包含要公開的各種方法和屬性的對象,則可以執行以下操作:
//Your self-executing anonymous function
(function($)
{
//Object which contains various useful methods and properties
var useful = {...};
//Expose it to the outside world
window.Useful = useful;
})(jQuery);
編輯:正如其他人所指出的那樣,這不是理想的解決方案,因為如果您不小心的話,確實會遇到命名沖突。 另外,將匿名函數外部的對象用作命名空間對象(如其他人所述)是我的首選方法
這不是理想的做法,但是您可以在全局范圍內聲明這些函數。
(function($) {
globalFunct = function (arg1, arg2) { // Don't use var keyword
...
};
})(jQuery);
這是不理想的,因為您可能會遇到命名沖突,就像使用jQuery觀察到的那樣。 通過將所有可全局訪問的方法放在“包”中來改進此方法。 為此選擇一個唯一的名稱。 這樣可以防止碰撞。
// Somewhere outside of your anonymous function, in the global scope
var myPackage = {};
(function($) {
myPackage.globalFunct = function (arg1, arg2) {
...
};
})(jQuery);
然后通過調用myPackage.globalFunct()
來調用該方法。
您不能從“外部世界”訪問函數上下文。 好吧,為了准確起見,您可以在一些允許訪問.__parent__
屬性的較舊的js引擎中進行此.__parent__
,但是這已經很久了,不再可用。
但是,您可能需要在閉包中公開某些功能,或者在其中寫入所有邏輯的地方創建一個名稱空間對象(在父上下文中也必須可用)。
所以我建議像
(function( $ ) {
function myFunc() {
// do stuff
}
function anotherFunc() {
}
window.myFunc = myFunc; // expose myFunc globally
}( jQuery ));
甚至更好:
var myNameSpace = { };
(function( $ ) {
myNameSpace.myFunc = function() {
// do stuff
};
}( jQuery ));
// somewhere else
myNameSpace.myFunc();
是的,您可以從閉包內“導出”功能:是的,您可以從閉包內“導出”功能:
(function() {
function a() {
console.log("a");
}
function b() {
a();
console.log("b");
}
// make b globally available
window.b = b;
})();
b();
window.PARTY_CATS_jQuery = jQuery.noConflict(true);
(function($) {
$(function() {
// All of my code goes here.
});
})(COMPANY_NAME_jQuery);
然后在您的全局函數中使用PARTY_CATS_jQuery
如果您覺得PARTY_CATS_
名稱不夠獨特,請選擇更安全的名稱,例如BABY_KILLER_jQuery
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.