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

时间:2012-01-20 13:46:10

标签: javascript

长话短说,我有一个使用jQuery的长代码。大量的文件,函数等我们的用户不太理想,因为我们的代码存在问题,因为他们安装的一些插件,工具栏等打破了我们的JavaScript代码,因为jQuery被包含两次而且讨厌的东西就是这样。

我以为我可以

  1. 包含jQuery
  2. 使用$ .noConflict
  3. 然后将我的其余代码包含在以下内容中:
  4. (function($) { 
        // All of my code goes here.
    })(jQuery);
    

    我还没有检查这是否解决了我们与这些用户的问题,但确实有效。问题是,在网站的一部分(图片上传)中,我们有一个iframe需要调用我们的大块代码中定义的一些函数。我已经尝试将这些函数放在这个未命名的函数调用之外,但它本身就使用了必须存在的其他函数。

    我是如何能够从其外部的代码访问该函数内部定义的函数(如上所示)的任何想法或解决方法?

    谢谢!

5 个答案:

答案 0 :(得分:1)

为什么要在调用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);
编辑:正如其他人所说,它不是一个理想的解决方案,因为如果你不小心,你确实会遇到命名冲突。此外,使用匿名函数外部的对象作为命名空间对象(正如其他人所说)是我的首选方法

答案 1 :(得分:1)

这不是一种理想的做法,但您可以在全局范围内声明这些功能。

(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()来调用该方法。

答案 2 :(得分:1)

您无法从“外部世界”访问功能上下文。好吧,为了获得成功,你可以在一些允许访问.__parent__属性的较旧的js引擎中执行此操作,但这是旧的'n'busted并且不再可用。

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

所以我建议像

这样的东西
(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();

答案 3 :(得分:0)

是的,您可以从闭包中“导出”该函数: 是的,您可以从闭包中“导出”该函数:

(function() {
    function a() {
        console.log("a");
    }

    function b() {
        a();
        console.log("b");
    }

    // make b globally available
    window.b = b;
})();

b();

答案 4 :(得分:0)

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