Почему ECMAScript 5 добавил .bind ()? - PullRequest
2 голосов
/ 09 марта 2012

Я только что закончил читать статью о строгом режиме ECMAScript 5.

В нем говорится, что ECMAScript 5 добавил .bind ().

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

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

Разве это не идентично obj.method.call (obj, "hello") ??

Ответы [ 2 ]

12 голосов
/ 09 марта 2012

Нет, это не идентично.

С bind вы создаете функцию , ничего не вызывая.С 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 голосов
/ 26 сентября 2015

Основная причина создания новой функции из существующей - это возможность передавать ее вместе с объектом, для которого она будет вызываться. Учтите это:

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', она не будет вызываться, если для 'this' установлено значение 'obj', если она не связана с bind ().

...