关于javascript:这个函数定义有什么意义?

What is the significance of this function definition?

本问题已经有最佳答案,请猛点这里访问。

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

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

但不是这个:

1
2
3
4
5
6
7
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">

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

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

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

底部的(jQuery));有什么意义?


一个立即调用的函数表达式,它在其作用域内将jQuery别名为$

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

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

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

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

有关jQuery插件创作的更多信息。


这是为变量赋一个函数:

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

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

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

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

1
2
3
4
5
$ = {
    fn: {
        idle: function () {}
    }
};

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

1
2
3
4
5
var myVar = {};
myVar.test.foo = {}; // results in error because myVar.test is undefined
myVar.test = {
    foo: {}
}; // this is correct


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

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

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

1
2
3
(function ($) {
    // inside stuff
}(jQuery));

jQuery作为$导入到函数体中,并立即运行该函数。

1
2
3
4
5
// 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添加到库中。

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