1

我在某处读到,在 JavaScript 中使用 jQuery 的最佳方法是使自调用匿名函数像这样传递 jQuery:

( function ($) {
    ...
}) (jQuery);

这样,$也可以用于其他功能中的其他事情(如MooTools)

但是我如何jQuery安全地传递给其他函数呢?

例如,这不起作用:

( function ($) {
    i_too_can_use_jquery('simple_string')l
}) (jQuery);

function i_too_can_use_jquery (aString, $=jQuery) { // causes error :(
    ...                                       // Uncaught SyntaxError: Unexpected token =
}

那么,这样做的正确方法是什么?

4

4 回答 4

3

考虑使用jQuery.noConflict

var $_ = jQuery.noConflict();
$('someId'); // MooTools
$_('#someId'); // jQuery

或者:

jQuery.noConflict();
$('someId'); // MooTools
(function($){
    $('#someId'); //jQuery
}(jQuery);
于 2013-10-13T13:40:11.940 回答
1

无需添加参数,因为您没有编辑任何内容:

function x()
{   var $ = jQuery;
    // do something
}

但是,您可能想编辑$一天,这可能会使它变得更加困难。在任何情况下,您都可以在 IIFE 中定义另一个函数并使其成为全局函数:

(function ($, global) {
    global.i_too_can_use_jquery = function (aString) {
        // do something
    };
    i_too_can_use_jquery('simple_string');
})(jQuery, window);
于 2013-10-13T13:42:09.953 回答
1

每个想要以这种方式使用 jQuery 的代码“模块”都应该包含在 (function($) { ... })(jQuery) 前缀/后缀中。

因此,在您的示例中,我可以假设 i_too_can_use_jquery 是一个仅由第一个匿名模块使用的函数:

( function ($) {
    i_too_can_use_jquery('simple_string')l

function i_too_can_use_jquery (aString) {
    ...                                      
}
}) (jQuery);

或者作为需要导出的方法:

// first module
( function ($) {
    i_too_can_use_jquery('simple_string')l

}) (jQuery);

// second module
(function($) {
window.i_too_can_use_jquery = function(aString) {
    ...                                      
}
})(jQuery);

其中任何一个都修复了您看到的语法错误,但正如您所见,第二个在维护函数范围方面有一些“模块”开销。

但是,您必须考虑是否真的需要这种自调用匿名函数。你真的使用其他使用 $ 字符的库吗?你打算在未来这样做吗?如果你不需要它就不要写它。

于 2013-10-13T13:28:11.877 回答
0

Javascript 不支持您使用的可选参数形式:

function i_too_can_use_jquery (aString, $=jQuery) { /* the $=jQuery is invalid */

实现可选参数的正确方法是检查是否已定义:

function i_too_can_use_jquery (aString, $) { /* the $=jQuery is invalid */
    if(typeof $ === 'undefined') $ = jQuery;
于 2013-10-13T13:36:54.113 回答