js call函數


在分析jquery源碼時,遇到each函數體里的一段代碼:

  1: if ( isObj ) {
  2:     for ( name in object ) {
  3:         if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
  4:             break;
  5:         }
  6:     }
  7: } else {
  8:     for ( ; i < length; ) {
  9:         if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
 10:             break;
 11:         }
 12:     }
 13: }

對js中的call理解不深,便寫了一段測試代碼:

  1: function each( object, callback ) {
  2:     if ( Array.isArray( object ) ) {
  3:         for ( var i = 0; i < object.length; i++ ) {
  4:             // callback.call( null, i, object[i] );  
  5:             callback( i, object[i] );
  6:         }
  7:     } 
  8: }

兩個函數都可以得到正確結果,那為什么還要使用call方法,使用call方法的好處在哪里。於是在MDN上找到一段代碼示例,經常認真分析,讓我對call的認識更深一層。

  1: function Product(name, price) {  
  2:   this.name = name;  
  3:   this.price = price;  
  4:   return this;  
  5: }  
  6:   
  7: function Food(name, price) {  
  8:   Product.call(this, name, price); 
  9:   this.category = 'food';  
 10: }  
 11: Food.prototype = new Product();  
 12:   
 13: function Toy(name, price) {  
 14:   Product.call(this, name, price); 
 15:   this.category = 'toy';  
 16: }  
 17: Toy.prototype = new Product();  
 18:   
 19: var cheese = new Food('feta', 5);  
 20: var fun = new Toy('robot', 40); 

是不是非常像C#中的繼承關系呀,通過查看console,實例fun的屬性都得到賦值。說明在調用call時,Product中的this就變成了fun,神奇吧,而C#中的函數就只能允許所在類調用,絕對不許為他所用!

PS:我一般習慣性地查MDN,網友franky建議查ES5,Mark!

ES5官方文檔:http://es5.github.com/

MDN:https://developer.mozilla.org


---end

作者:清流魚

出處:http://www.cnblogs.com/qingliuyu/

新浪微博:http://weibo.com/qingliuyu

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。


免責聲明!

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



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