簡體   English   中英

從全局范圍訪問在函數內部定義的函數?

[英]Accessing a function defined inside a function from the global scope?

長話短說,我有一個使用jQuery的長代碼。 許多文件,函數等。我們的用戶數量少於理想的用戶,我們的代碼有問題,因為安裝了一些插件,工具欄等會破壞我們的JavaScript代碼,這是因為jQuery被兩次包含在內,並且令人討厭。

我以為我可以

  1. 包括jQuery
  2. 使用$ .noConflict
  3. 然后在類似以下內容之間包含我的全部代碼:

(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM