2012-03-08 25 views
2

我剛讀完一篇關於ECMAScript 5嚴格模式的文章。ECMAScript 5爲什麼添加.bind()?

它說ECMAScript 5添加了.bind()。

var obj = { 
    method: function(name){ 
    this.name = name; 
    } 
}; 

obj.method.bind(obj,"hello"); 

是不是相同obj.method.call(OBJ, 「你好」) ??

+1

'obj.method.bind(obj,「hello」)()'將是相同的。 – pimvdb 2012-03-09 15:24:17

回答

12

不,它不相同。

綁定你是產生一個函數,而不會調用任何東西。與call - 如在您的obj.method.call(obj, 'hello') - 你實際上調用的方法。

obj.method.bind(obj, 'hello')「相同」的表達應爲function(){obj.method.call(obj, 'hello')}。這是更粗俗的。而這正是ES5試圖爲其提供便利的原因。

介紹bind也有歷史原因;它幾年前首次成爲Prototype.js中的輔助方法之一。然後進入其他流行的庫,如underscore.js。 ES5只是遵循已經流行和需求的東西。

0

創建現有函數的一個新功能的主要原因是能夠將它與它將被調用的對象一起傳遞。這樣考慮:

var obj = { 
    x:"Hello", 
    printPropX: function() { 
    alert(this.x); 
    } 
}; 

setTimeout(obj.printPropX.bind(obj), 1000); // will alert "Hello" after 1 second 

setTimeout(obj.printPropX, 1000); // will fail as 'this' won't be defined inside the function body once invoked 

雖然printPropX()是對象的成員函數「OBJ」,它不會被與「這個」設置爲「物鏡」,除非結合的使用綁定()調用。