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