2013-05-17 32 views
0

我一直在試圖模仿一個小得多的插件jQuery的語法。我一直努力在內部使用$對象的方法一段時間。讓我說明:Javascript框架不能真的在內部調用方法

(function() { 
    window.$ = function (element) { 
     return new Plugin(element); 
    }; 

    var Plugin = function (element) { 
     this.element = element; 
    }; 

    Plugin.prototype = { 
     foreach: function(callback) { 
      // Of course the "foreach" function will be bigger than this, this is just for testing. 
      var values = []; 
      for (i = 0; i < this.element.length; i++) { 
       values[i] = callback.call(this, this.element[i], i); 
      } 

      return values; 
     }, 
     someOtherFunctionThatUsesForeachInternally: function() { 
      var arr = []; 
      $([6, 32, 2]).foreach(function(item, key) { 
       arr[key] = item + 7; 
      }); 
      return arr; 
     } 
    }; 
})(); 

/* Desired result: 
[ 
    [13, 39, 9], 
    [13, 39, 9], 
    [13, 39, 9], 
    [13, 39, 9] 
] 
*/ 

var arr = [1, 5, 7, 9]; 
var test = []; 

$(arr).foreach(function(value, key) { 
    test[key] = this.someOtherFunctionThatUsesForeachInternally(); 
}); 

console.log(test); 

一個新插件對象被實例化時,美元符號一起使用的自變量(例如數組,在示例中,這將是var arr = [1, 5, 7, 9])和方法之後立刻稱爲。

我寫了一個小的foreach來測試,但它似乎不可能從框架內的函數調用它。 console.log(test);在最後會輸出[[13,39,9]],而不是爲var arr的每個元素執行。我想這是因爲在內部調用foreach時,this被覆蓋。

有關如何解決此問題的任何想法?

回答

1

您的foreach方法中的for循環索引(i)正在被覆蓋,因爲您已將其聲明在全局範圍內。始終使用var聲明變量:

for (var i = 0; i < this.element.length; i++) { 
    values[i] = callback.call(this, this.element[i], i); 
} 

DEMO:http://jsfiddle.net/QhXa7/

+0

該死!如此簡單 – user2180613

+0

@ user2180613找到一切都很痛苦:)一切看起來不錯,所以我不明白爲什麼它不起作用。然後,我隨機地意識到'var'不在那裏,添加它並再次嘗試,並且它工作:) – Ian

+1

通過JShint進入垃圾代碼的習慣是一種很好的方式來捕獲這類錯誤,然後它成長爲實際問題。 – Racheet