Использование метода JavaScript 'bind' - PullRequest
515 голосов
/ 10 февраля 2010

Какая польза от bind() в JavaScript?

Ответы [ 13 ]

522 голосов
/ 12 апреля 2012

Bind создает новую функцию, в которой для this будет установлен первый параметр, переданный в bind().

Вот пример, который показывает, как использовать bind для передачи метода-члена, который имеет правильный this:

var Button = function(content) { 
  this.content = content;
};
Button.prototype.click = function() {
  console.log(this.content + ' clicked');
};

var myButton = new Button('OK');
myButton.click();

var looseClick = myButton.click;
looseClick(); // not bound, 'this' is not myButton - it is the global object

var boundClick = myButton.click.bind(myButton);
boundClick(); // bound, 'this' is myButton

Который распечатывает:

OK clicked
undefined clicked
OK clicked

Вы также можете добавить дополнительные параметры после 1-го (this) параметра, и bind передаст эти значения исходной функции. Любые дополнительные параметры, которые вы позже передадите связанной функции, будут переданы после связанных параметров:

// Example showing binding some parameters
var sum = function(a, b) {
  return a + b;
};

var add5 = sum.bind(null, 5);
console.log(add5(10));

Который распечатывает:

15

Проверьте Функция привязки JavaScript для получения дополнительной информации и интерактивных примеров.

Обновление: в ECMAScript 2015 добавлена ​​поддержка => функций. Функции => более компактны и не изменяют указатель this по сравнению с их областью определения, поэтому вам может не понадобиться использовать bind() так часто. Например, если вы хотите, чтобы функция в Button из первого примера подключала обратный вызов click к событию DOM, все следующие допустимые способы сделать это:

Button.prototype.hookEvent(element) {
  // Use bind() to ensure 'this' is the 'this' inside click()
  element.addEventListener('click', this.click.bind(this));
};

или:

Button.prototype.hookEvent(element) {
  // Use a new variable for 'this' since 'this' inside the function
  // will not be the 'this' inside hookEvent()
  var me = this;
  element.addEventListener('click', function() { me.click() });
}

Или:

Button.prototype.hookEvent(element) {
  // => functions do not change 'this', so you can use it directly
  element.addEventListener('click', () => this.click());
}
173 голосов
/ 17 декабря 2013

Самое простое использование bind() - создать функцию, которая не имеет значения как это называется, вызывается с определенным значением this.

x = 9;
var module = {
    x: 81,
    getX: function () {
        return this.x;
    }
};

module.getX(); // 81

var getX = module.getX;
getX(); // 9, because in this case, "this" refers to the global object

// create a new function with 'this' bound to module
var boundGetX = getX.bind(module);
boundGetX(); // 81

Пожалуйста, обратитесь к этой ссылке для получения дополнительной информации

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

156 голосов
/ 29 ноября 2013

bind позволяет-

  • установить значение «this» для определенного объекта. Это становится очень полезным, так как иногда это не то, что предназначено.
  • методы повторного использования
  • функция карри

Например, у вас есть функция для удержания ежемесячных клубных сборов

function getMonthlyFee(fee){
  var remaining = this.total - fee;
  this.total = remaining;
  return this.name +' remaining balance:'+remaining;
}

Теперь вы хотите повторно использовать эту функцию для другого члена клуба. Обратите внимание, что ежемесячная плата будет варьироваться от участника к участнику.

Давайте представим, что у Рэйчел баланс 500 и ежемесячный членский взнос 90.

var rachel = {name:'Rachel Green', total:500};

Теперь создайте функцию, которую можно использовать снова и снова, чтобы ежемесячно удерживать комиссию с ее счета

//bind
var getRachelFee = getMonthlyFee.bind(rachel, 90);
//deduct
getRachelFee();//Rachel Green remaining balance:410
getRachelFee();//Rachel Green remaining balance:320

Теперь ту же функцию getMonthlyFee можно использовать для другого члена с другим членским взносом. Например, Росс Геллер имеет баланс 250 и ежемесячную плату 25

var ross = {name:'Ross Geller', total:250};
//bind
var getRossFee = getMonthlyFee.bind(ross, 25);
//deduct
getRossFee(); //Ross Geller remaining balance:225
getRossFee(); //Ross Geller remaining balance:200
68 голосов
/ 18 января 2016

С Документы MDN на Function.prototype.bind():

Метод bind () создает новую функцию, которая при вызове имеет свою этому ключевому слову присваивается заданное значение с заданной последовательностью аргументы, предшествующие любому, указанному при вызове новой функции.

Итак, что это значит?!

Хорошо, давайте возьмем функцию, которая выглядит следующим образом:

var logProp = function(prop) {
    console.log(this[prop]);
};

Теперь давайте возьмем объект, который выглядит следующим образом:

var Obj = {
    x : 5,
    y : 10
};

Мы можем привязать нашу функцию к нашему объекту так:

Obj.log = logProp.bind(Obj);

Теперь мы можем запустить Obj.log в любом месте нашего кода:

Obj.log('x'); // Output : 5
Obj.log('y'); // Output : 10

Это работает, потому что мы привязали значение this к нашему объекту Obj.


Когда это действительно становится интересным, это когда вы привязываете не только значение для this, но и его аргумент prop:

Obj.logX = logProp.bind(Obj, 'x');
Obj.logY = logProp.bind(Obj, 'y');

Теперь мы можем сделать это:

Obj.logX(); // Output : 5
Obj.logY(); // Output : 10

В отличие от Obj.log, нам не нужно передавать x или y, потому что мы передали эти значения при нашей привязке.

14 голосов
/ 28 октября 2017

Переменные имеют локальные и глобальные области действия. Давайте предположим, что у нас есть две переменные с одинаковым именем. Один определяется глобально, а другой определяется внутри замыкания функции, и мы хотим получить значение переменной, которое находится внутри замыкания функции. В этом случае мы используем этот метод bind (). Пожалуйста, смотрите простой пример ниже:

   var x = 9;    // this refers to global "window" object here in the browser
var person = {
  x: 81,
  getX: function() { return this.x; }
};
var y = person.getX; // It will return 9, because it will call global value of x(var x=9).

var x2 = y.bind(person); // It will return 81, because it will call local value of x, which is defined in the object called person(x=81).

document.getElementById("demo1").innerHTML = y(); 
document.getElementById("demo2").innerHTML = x2(); 
<!DOCTYPE html>
<html>
<body>
<p id="demo1">0</p>
<p id="demo2">0</p>
</body>
</html>
12 голосов
/ 22 апреля 2014

Я объясню привязку теоретически, а также практически

bind в javascript - это метод - Function.prototype.bind. привязка это метод. Вызывается по прототипу функции. Этот метод создает функцию, тело которой похоже на функцию, для которой он вызывается, но «this» относится к первому параметру, переданному методу связывания. Его синтаксис

     var bindedFunc = Func.bind(thisObj,optionsArg1,optionalArg2,optionalArg3,...);

Пример: -

  var checkRange = function(value){
      if(typeof value !== "number"){
              return false;
      }
      else {
         return value >= this.minimum && value <= this.maximum;
      }
  }

  var range = {minimum:10,maximum:20};

  var boundedFunc = checkRange.bind(range); //bounded Function. this refers to range
  var result = boundedFunc(15); //passing value
  console.log(result) // will give true;
11 голосов
/ 16 августа 2018

Резюме:

Метод bind() принимает объект в качестве первого аргумента и создает новую функцию. Когда функция вызывается, значение this в теле функции будет объектом, который был передан в качестве аргумента функции bind().

Как все-таки работает this в JS

Значение this в javascript зависит всегда от того, какой объект вызывается функцией. Значение этого всегда относится к объекту слева от точки, откуда вызывается функция . В случае глобальной области видимости это window (или global в nodeJS). Только call, apply и bind могут изменить эту привязку по-разному. Вот пример, показывающий, как работает это ключевое слово:

let obj = {
  prop1: 1,
  func: function () { console.log(this); } 
}

obj.func();   // obj left of the dot so this refers to obj

const customFunc = obj.func;  // we store the function in the customFunc obj

customFunc();  // now the object left of the dot is window, 
               // customFunc() is shorthand for window.customFunc()
               // Therefore window will be logged

Как используется связывание?

Привязка может помочь в преодолении трудностей с ключевым словом this, имея фиксированный объект, на который будет ссылаться this. Например:

var name = 'globalName';

const obj = {
  name: 'myName',
  sayName: function () { console.log(this.name);}
}

const say = obj.sayName; // we are merely storing the function the value of this isn't magically transferred

say(); // now because this function is executed in global scope this will refer to the global var

const boundSay = obj.sayName.bind(obj); // now the value of this is bound to the obj object

boundSay();  // Now this will refer to the name in the obj object: 'myName'

Как только функция привязана к определенному значению this, мы можем передать его и даже присвоить свойства другим объектам. Значение this останется прежним.

9 голосов
/ 28 марта 2017

Метод bind () создает новый экземпляр функции, это значение которого связано со значением, которое было передано в bind (). Например:

   window.color = "red"; 
   var o = { color: "blue" }; 
   function sayColor(){ 
       alert(this.color); 
   } 
   var objectSayColor = sayColor.bind(o); 
   objectSayColor(); //blue 

Здесь новая функция objectSayColor () создается из sayColor () путем вызова bind () и передачи объекта o. Функция objectSayColor () имеет это значение, эквивалентное o, поэтому при вызове функции, даже в качестве глобального вызова, отображается строка «синий».

Ссылка: Николас С. Закас - ПРОФЕССИОНАЛЬНЫЙ JAVASCRIPT® ДЛЯ ВЕБ-РАЗРАБОТЧИКОВ

8 голосов
/ 04 марта 2017

Создание новой функции путем привязки аргументов к значениям

Метод bind создает новую функцию из другой функции с одним или несколькими аргументами, привязанными к конкретным значениям, включая неявный аргумент this.

Частичное применение

Это пример частичного применения . Обычно мы предоставляем функцию со всеми ее аргументами, которая дает значение. Это известно как функция приложения. Мы применяем функцию к ее аргументам.

Функция высшего порядка (HOF)

Частичное применение является примером функции более высокого порядка (HOF), поскольку оно дает новую функцию с меньшим числом аргументов.

Связывание нескольких аргументов

Вы можете использовать bind для преобразования функций с несколькими аргументами в новые функции.

function multiply(x, y) { 
    return x * y; 
}

let multiplyBy10 = multiply.bind(null, 10);
console.log(multiplyBy10(5));

Преобразование из метода экземпляра в статическую функцию

В наиболее распространенном случае использования при вызове с одним аргументом метод bind создаст новую функцию со значением this, связанным с конкретным значением. По сути это превращает метод экземпляра в статический метод.

function Multiplier(factor) { 
    this.factor = factor;
}

Multiplier.prototype.multiply = function(x) { 
    return this.factor * x; 
}

function ApplyFunction(func, value) {
    return func(value);
}

var mul = new Multiplier(5);

// Produces garbage (NaN) because multiplying "undefined" by 10
console.log(ApplyFunction(mul.multiply, 10));

// Produces expected result: 50
console.log(ApplyFunction(mul.multiply.bind(mul), 10));

Реализация StateBack CallBack

В следующем примере показано, как использование привязки this может позволить объектному методу действовать как обратный вызов, который может легко обновлять состояние объекта.

function ButtonPressedLogger()
{
   this.count = 0;
   this.onPressed = function() {
      this.count++;
      console.log("pressed a button " + this.count + " times");
   }
   for (let d of document.getElementsByTagName("button"))
      d.onclick = this.onPressed.bind(this);
}

new ButtonPressedLogger();      
<button>press me</button>
<button>no press me</button>
5 голосов
/ 14 января 2014

Как уже упоминалось, Function.bind() позволяет вам указать контекст, в котором будет выполняться функция (то есть, вы можете указать, к какому объекту относится ключевое слово this в теле функции.

Пара аналогичных методов API инструментария, которые выполняют аналогичную службу:

jQuery.proxy ()

Dojo.hitch ()

...