2012-01-20 166 views
0

长话短说,我有一个使用jQuery的长码。因为一些插件,工具栏和因为jQuery的一样,他们已经安装了中断我们的JavaScript代码被列入两次,这样肮脏的东西文件,功能等的很多比我们的用户的理想的量一个不太正与我们的代码的问题。从全局范围访问函数内定义的函数?

我想我可能只是

  1. 包括jQuery的
  2. 使用$ .noConflict
  3. 然后包括像之间我的代码的整个休息:

(function($) { 
    // All of my code goes here. 
})(jQuery); 

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

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

谢谢!

+0

PS - 您的匿名功能有点多余。你只需要:'(function($){var mycode =“goes here”;})(jQuery);'。 – cheeken

+0

谢谢,编辑。 – manuelflara

回答

1

你不能从“外部访问函数的上下文世界”。那么,为了获得成功,你可以在一些允许访问.__parent__属性的较老的js引擎中做到这一点,但那是旧的,不可用的。然而,你需要在你的闭包中公开一些函数,或者你需要创建一个命名空间对象,在其中编写所有的逻辑(这些逻辑也必须在父上下文中可用)。

所以我建议像

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

你为什么要到你传递给您的自执行匿名函数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); 

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

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

0

是的,你可以“出口”从封闭中的函数: 是的,你可以“出口”从封闭中的函数:

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

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

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

b(); 
0
window.PARTY_CATS_jQuery = jQuery.noConflict(true); 

(function($) { 
    $(function() { 
    // All of my code goes here. 
    }); 
})(COMPANY_NAME_jQuery); 

然后,只需使用你的全局函数

PARTY_CATS_jQuery如果你觉得PARTY_CATS_不一个足够独特的名字选择像这样更安全的名字