Javascript 从全局范围访问函数中定义的函数?

Javascript 从全局范围访问函数中定义的函数?,javascript,Javascript,长话短说,我有一个使用jQuery的长代码。很多文件、函数等等。我们的代码有问题的用户数量不太理想,因为他们安装的一些插件、工具栏等破坏了我们的JavaScript代码,因为jQuery被包含了两次,以及类似的令人讨厌的东西 我想我可以 包含jQuery 使用$.noConflict 然后将我的代码的其余部分包含在以下内容中: 我还没有检查这是否解决了我们与这些用户之间的问题,但它确实有效。问题是,在站点的一部分(图像上传)中,我们有一个iframe,它需要调用我们大量代码中定义的一些函数。我

长话短说,我有一个使用jQuery的长代码。很多文件、函数等等。我们的代码有问题的用户数量不太理想,因为他们安装的一些插件、工具栏等破坏了我们的JavaScript代码,因为jQuery被包含了两次,以及类似的令人讨厌的东西

我想我可以

  • 包含jQuery
  • 使用$.noConflict
  • 然后将我的代码的其余部分包含在以下内容中:
  • 我还没有检查这是否解决了我们与这些用户之间的问题,但它确实有效。问题是,在站点的一部分(图像上传)中,我们有一个iframe,它需要调用我们大量代码中定义的一些函数。我尝试过将这些函数从这个未命名的函数调用中删除,但它本身使用了其他必须存在的函数

    关于如何从函数外部的代码访问该函数(如上所示)中定义的函数,有什么想法或解决方法吗


    谢谢

    为什么要将代码包装在对jQuery函数对象的调用中,并将其传递给自动执行的匿名函数;您是否打算从所有代码中创建jQuery对象

    为了向外界公开代码,需要将函数和对象分配给代码范围之外的对象,例如窗口对象

    例如,如果您创建了一个包含要公开的各种方法和属性的对象,则可以执行以下操作:

    //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);
    

    编辑:正如其他人所指出的,这不是一个理想的解决方案,因为如果不小心,您确实会遇到命名冲突。另外,使用匿名函数外部的对象作为名称空间对象(如其他人所述)是我的首选方法

    为什么要将代码包装在对jQuery函数对象的调用中,并将其传递给自动执行的匿名函数;您是否打算从所有代码中创建jQuery对象

    为了向外界公开代码,需要将函数和对象分配给代码范围之外的对象,例如窗口对象

    例如,如果您创建了一个包含要公开的各种方法和属性的对象,则可以执行以下操作:

    //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()

    调用该方法这不是一种理想的做法,但您可以在全局范围内声明这些函数

    (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()
    调用该方法。是的,您可以从闭包中“导出”函数:
    是的,您可以从闭包中“导出”函数:

    (function() {
        function a() {
            console.log("a");
        }
    
        function b() {
            a();
            console.log("b");
        }
    
        // make b globally available
        window.b = b;
    })();
    
    b();
    
    是的,您可以从闭包中“导出”函数: 是的,您可以从闭包中“导出”函数:

    (function() {
        function a() {
            console.log("a");
        }
    
        function b() {
            a();
            console.log("b");
        }
    
        // make b globally available
        window.b = b;
    })();
    
    b();
    

    您无法从“外部世界”访问函数上下文。好吧,可以在一些旧的js引擎中实现,这些引擎允许访问
    。\uuuuu parent\uuuuuu
    属性,但这已经过时了,不再可用

    但是,您需要在闭包中公开一些函数,或者创建一个名称空间对象,在其中写入所有逻辑(也必须在父上下文中可用)

    所以我建议像

    (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();
    

    您无法从“外部世界”访问函数上下文。好吧,可以在一些旧的js引擎中实现,这些引擎允许访问
    。\uuuuu parent\uuuuuu
    属性,但这已经过时了,不再可用

    但是,您需要在闭包中公开一些函数,或者创建一个名称空间对象,在其中写入所有逻辑(也必须在父上下文中可用)

    所以我建议像

    (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();
    
    然后在全局函数中使用
    PARTY\u CATS\u jQuery

    如果你觉得“派对猫”这个名字不够独特,那就选一个更安全的名字,比如“婴儿杀手”

    然后在全局函数中使用
    PARTY\u CATS\u jQuery


    如果你觉得“派对猫”这个名字不够独特,那就选择一些更安全的名字,比如“婴儿杀手”

    PS-你的匿名函数有点多余。您只需要:
    (函数($){var mycode=“goes here”;})(jQuery)
    .PS-您的匿名函数中有一些额外的错误。您只需要:
    (函数($){var mycode=“goes here”;})(jQuery)