jQuery回調函數


1.引言

今天在學習《jQuery基礎教程》在學習編寫插件的時候,書中說利用回調函數來當參數,會極大的提高程序的靈活性。對回調函數很陌生。研究了一下給的示例程序。感覺對回調函數有了基本的了解。記錄下來,以備后用。

2.定義

回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,才會真正的執行回調函數內部的方法。

3.代碼

JS代碼

 1 (function($){
 2     $.fn.shadow = function(opts){  3         //定義的默認的參數
 4         var defaults = {
 5             copies: 5,
 6             opacity:0.1,
 7             //回調函數
 8  copyOffset:function(index){  9                 return{x:index,y:index};
10             }
11         };
12         //將opts的內容合並到default中。
13         var options = $.extend(defaults,opts);
14         return this.each(function(){
15             var $originalElement  = $(this);
16             //設置參數對象
17             for(var i=0;i<options.copies;i++)
18             {
19                 var offset = options.copyOffset(i); 20                 $originalElement
21                 .clone()
22                 .css({
23                     position:'absolute',
24                     left:$originalElement.offset().left + offset.x,
25                     top:$originalElement.offset().top + offset.y,
26                     margin:0,
27                     zIndex:-1,
28                     //設置參數對象
29                     opacity:options.opacity
30                 })
31                 .appendTo('body');
32             }
33         });
34     };
35 })(jQuery);
36 $(document).ready(function(){
37     $('h1').shadow({
38         copies:5,
39         copyOffset:function(index){ 40         return {x:-index,y:-2 * index}; 41         }
42     });
43 });

4.分析

通過這段代碼調試的時候進入的順序,便可理解回調函數的機制。通過對黃背景的四段代碼加入斷點。程序將會以以下的順序運行

39:先跑第39行,當DOM加載完畢后運行了shadow(),跑完39行並不會直接跑40行。而是直接調到了shadow()函數定義的地方。在這里只是聲明了copyOffset的函數指針。

2:這時候查看opts里面的內容Object { copies=5, copyOffset=function()}從這里可以看出來copyOffset只是一個function(),

8:開始走默認參數的copyOffset,與39行一樣,不會直接進入回調函數里面的內容。

19:走到這里時,需要將對CopyOffset發出請求並傳入了i作為參數。這時候i就是回調函數的參數index。

40:由於13行的”var options = $.Extend(defauflts,opts)”。opts的屬性會覆蓋掉default的屬性,所以不會走9行默認的參數中的回調函數的執行方法,而是走了第40行的回調函數的方法。

5.總結

從上面的分析可以看出,回調函數在參數中聲明時,相當於只是聲明了一個委托。等到用到這個參數的時候才會真正的執行回調函數里面的內容。

6.附html代碼

 1 <!DOCTYPE html>
 2 
 3 <html lang="en">
 4   <head>
 5     <meta charset="utf-8">
 6     <title>Developing Plugins</title>
 7 
 8     <link rel="stylesheet" href="08.css" type="text/css" />
 9     <link rel="stylesheet" href="ui-themes/smoothness/jquery-ui-1.10.0.custom.css" type="text/css" />
10 
11     <script src="jquery.js"></script>
12     <script src="jquery-ui-1.10.0.custom.min.js"></script>
13     <script src="08.js"></script>
14   </head>
15   <body>
16     <div id="container">
17       <h1>Inventory</h1>
18       <table id="inventory">
19         <thead>
20           <tr class="two">
21             <th>Product</th>
22             <th>Quantity</th>
23             <th>Price</th>
24           </tr>
25         </thead>
26         <tfoot>
27           <tr class="two" id="sum">
28             <td>Total</td>
29             <td></td>
30             <td></td>
31           </tr>
32           <tr id="average">
33             <td>Average</td>
34             <td></td>
35             <td></td>
36           </tr>
37         </tfoot>
38         <tbody>
39           <tr>
40             <td><a href="spam.html" data-tooltip-text="Nutritious and delicious!">Spam</a></td>
41             <td>4</td>
42             <td>2.50</td>
43           </tr>
44           <tr>
45             <td><a href="egg.html" data-tooltip-text="Farm fresh or scrambled!">Egg</a></td>
46             <td>12</td>
47             <td>4.32</td>
48           </tr>
49           <tr>
50             <td><a href="gourmet-spam.html" data-tooltip-text="Chef Hermann's recipe.">Gourmet Spam</a></td>
51             <td>14</td>
52             <td>7.89</td>
53           </tr>
54         </tbody>
55       </table>
56     </div>
57   </body>
58 </html>
Html代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM