標籤:code c ext a 使用 cti
由於方法和值為對象的屬性值沒什麼區別,因此很容易提取對象的方法作為回呼函數直接傳遞給高階函數。但這也很容易忘記應明確指定方法的接受者。例如,一個字串緩衝對象使用數組來儲存字串。
var buffer = { entries: [], add: function(args) { this.entries.push(args); }, concat: function() { return this.entries.join(‘‘); }};var arr = [‘alert‘, ‘-‘, ‘123‘];// error: entries is undefinedarr.forEach(buffer.add);buffer.concat();
方法的接受者取決於它是如何被調用的。forEach方法的實現使用全域對象作為預設的接受者。由於全域對象沒有entries屬性,因此這段代碼拋出了一個錯誤。
在回呼函數中執行方法
var arr = [‘alert‘, ‘-‘, ‘123‘];arr.forEach(function() { buffer.add(arr);});buffer.concat();
該方法建立一個顯示地以buffer對象方法的方式調用add()。
使用bind()返回一個指定接受者的函數
建立一個函數用來實現綁定其接受者到一個指定對象是常見的。
arr = [‘alert‘, ‘-‘, ‘123‘];arr.forEach(buffer.add.bind(buffer));buffer.concat();
注意,bind()返回的是一個新的函數而不是修改buffer.add函數。這意味著bind方法是安全的。
其實forEach()允許調用者提供一個可選的參數作為回呼函數的接受者。arr.forEach(buffer.add, buffer)。
相容沒有實現forEach()方法的瀏覽器
if(typeof Function.prototype.forEach !== ‘function‘) { Function.prototype.bind = function(context) { return this.apply(context, [].slice.call(arguments, 1)); }}