2013-07-30 46 views
10

我知道如何定義函數是這樣的:這個函數定義的意義是什麼?

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

這就是您如何定義jQuery插件。的 –

+1

可能重複的[爲什麼限定匿名函數,並將它傳遞的jQuery作爲參數?](http://stackoverflow.com/q/10371539/1420197) –

+0

http://stackoverflow.com/questions/2716069/how-does- this-javascript-jquery-syntax-work-function-window-undefined –

回答

8

一種immediately invoked function expression其中別名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 

更多關於jQuery plugin authoring

+0

爲什麼他們引用原型而不是讓我們使用它? – Virus721

+0

哦,只是發現我的websocket在Nightly上壞了。 @ Virus721抱歉不知道你的意思。 'jQuery.fn'只是對'jQuery.prototype'的一個快捷方式(參考),「寫得更少,做得更多」,正如他們所說的那樣。您可以使用其中任何一種。 '=]' –

+0

@ Virus721,因爲fn比原型短7個字符?我不知道。 –

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的別名,即它們是相同的東西。

這裏有很多別名使代碼比實際情況更復雜一些。

這是一個常見的結構,您將看到將plugins/mixins添加到庫中。

希望我能爲你解決這個問題。

1

將函數添加到$.fn使它們可用於jQuery對象。

$.fn.alertTitle = function() { alert($(this).attr('title')); }; 
$('#foo').alertTitle(); 
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 
相關問題