这个函数定义有什么意义?

时间:2013-07-30 15:13:18

标签: javascript jquery

我理解如何定义这样的函数:

function myfunc(x,y,z) {
   alert("Just an example " + x + y + z)
}

但不是这样:

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

    <script>
        (function ($) {
        $.fn.idle = function (x, y, z) {
            alert("Just an example " + x + y + z)
    }(jQuery));
    </script>

以上是我正在使用的库的一部分,但我根本无法理解$.fn.idle位。

它在做什么?它以某种方式定义了一个名为“idle”的函数,但是$.fn呢?那(function ($) {部分怎么样?我再次理解$(document).ready(function() {,但(function ($) {完全是异类。这是一个简短的手吗?

底部(jQuery));的重要性是什么?

4 个答案:

答案 0 :(得分:8)

immediately invoked function expression在其范围内将jQuery别名为$

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

它立即创建并执行一个函数。这样,无论全局$引用什么,您都可以在函数内部使用$来引用jQuery。对于使用jQuery.noConflict()的网页很有用。此IIFE内部声明的变量也不会泄漏到全局范围。


至于问题的其他部分,$.fn === jQuery.prototype。因此,通过向jQuery原型添加方法,您可以在任何jQuery对象上调用它。 E.g:

$.fn.doSomething = function(){}; //add a method to the jQuery prototype
$('selector').doSomething(); //then you may call it on any jQuery object

更多关于jQuery plugin authoring

答案 1 :(得分:1)

这被称为IIFE - 立即调用函数表达式。

(function ($) {
    // inside stuff
}(jQuery));  

jQuery作为$导入函数体,函数立即运行。

// inside stuff

$.fn.idle = function (x, y, z) {
    alert("Just an example " + x + y + z)
} // added in missing parentheses

$.fn相当于jQuery.fnjQuery.fn.idle只是jQuery.fn上指向某个函数的属性。

另一个有趣的观点是,jQuery.fnjQuery.prototype的别名,即它们是相同的。

这里的许多别名使代码比实际更复杂。

这是一个常见的结构,您可以看到将插件/ mixins添加到库中。

希望,我能为你做好准备。

答案 2 :(得分:1)

$.fn添加函数使它们可用于jQuery对象。

$.fn.alertTitle = function() { alert( $(this).attr('title') ); };
$('#foo').alertTitle();

答案 3 :(得分:1)

这是为变量赋值函数:

var test = function () { alert('testing'); }
test(); // will alert testing

分配给变量的函数也称为“匿名函数”,因为它没有名称,通常用于将函数作为参数传递给另一个函数。

在javascript中,变量可以以$开头,jQuery使用它。 jQuery是一个对象,它具有属性,其中一个属性称为fn。此属性还可以包含属性,在本例中为idle

所以$.fn.idle = function () {};归结为:

$ = {
    fn: {
        idle: function () {}
    }
};

这也被称为“命名空间”,尽管它也有其他细微差别。 另请注意,您只能为现有对象指定属性:

var myVar = {};
myVar.test.foo = {}; // results in error because myVar.test is undefined
myVar.test = {
    foo: {}
}; // this is correct