Javascript 这个函数定义的意义是什么?

Javascript 这个函数定义的意义是什么?,javascript,jquery,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 ($) { $.f

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

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=函数(x,y,z){
警报(“只是一个示例”+x+y+z)
}(jQuery));
上面是我正在使用的库的一部分,但我无法理解
$.fn.idle

它在做什么?它在定义一个名为“idle”的函数,但是
$.fn
呢?还有
(函数($){
部分呢?再一次,我理解
$(文档)。ready(函数(){
)但是
(函数($){
是完全陌生的。它是一个速记吗

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

在其范围内将
jQuery
别名为
$

(function($) {}(jQuery));
它立即创建并执行一个函数。通过这种方式,您可以在函数中使用
$
引用jQuery,而不管全局
$
引用的是什么。对于使用
jQuery.noConflict()
的页面非常有用。此外,在该IIFE中声明的变量不会泄漏到全局范围


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

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

更多信息。

这被称为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.fn
jQuery.fn.idle
只是
jQuery.fn
上指向函数的属性

另一个有趣的点是,
jQuery.fn
jQuery.prototype
的别名,即它们是相同的东西

这里的许多别名使得代码比实际情况要复杂一些

这是向库中添加插件/混音器时常见的结构


希望如此,我为您将其切碎。

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

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

这是将函数分配给变量:

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

这就是定义jQuery插件的方式。这可能是定义插件的一种非常常见的模式。您在问题中提出的几个概念可能会在单独的问题中得到回答,因为它们是单独的概念。实际上这是一个语法错误,您忘了
}
为什么他们引用原型而不是让我们使用它?哦,刚刚注意到我的WebSocket每晚都会坏。@Virus721对不起,我不知道你的意思。
jQuery.fn
只是
jQuery.prototype
的一个快捷方式(引用),“写得少,做得多”正如他们所说。你可以使用其中任何一个。
=]
@Virus721,因为fn比prototype短7个字符?我不知道。其他库,如momente.js,也使用
fn
作为
prototype
的快捷方式。我想,创建这样的快捷方式可以减少库的缩小尺寸,而且它的插件也相当灵活h它的使用频率。