Вадим и Корбины оба в основном правильно, но добавить немного специфичности и многословия (я говорю громкие слова), bind_1 возвращает функцию, которая будет всегда вызова данной функция (е) с заданными аргументами (о) как контекст - установка контекста означает, что внутри функции это ключевое слово будет ссылаться на назначенный объект контекста. В то время как bind_2 возвращает либо: функция (f) с контекстом (o), либо возвращает результат вызова функции (f) с контекстом (o).
Функция.prototype.bind также может использоваться для приложения с частичной функцией. Например, если вы не заботитесь, чтобы использовать контекст внутри функции вы можете предоставить функции с аргументами, которые уже применяются и, следовательно, упростить последующие вызовы:
// define a function which expects three arguments
function doSomething (person, action, message) {
return person + " " + action + " " + message + ".";
}
var shortcut = doSomething.bind(null, "Joshua", "says");
// the call to bind here returns a function based on doSomething with some changes:
// 1. the context (_this_) is set to null
// 2. the arguments (person and action) are defined ("Joshua" and "says") and not changeable
// now we can use shortcut("Hello")
// instead of doSomething("Joshua", "says", "Hello")
shortcut("Hello"); // returns "Joshua says Hello."
Первый аргумент, переданный .Не(), .call (), или .bind() изменяет контекст функции/метода. Контекст - это значение этого ключевого слова; таким образом, внутри функции это значение будет передано как первый аргумент. Здесь я использовал null, потому что в этом случае функции не требуется определенное значение для контекста; и null меньше символов, чем undefined, и чувствует себя лучше, чем некоторое количество мусора ("" - пустая строка, {} - пустой объект и т. д.). Таким образом, остальные две переменные назначаются в качестве первого набора аргументов функции.
+1 и теперь я чувствую себя глупо. Я как-то полностью пренебрег ветвью 'if (f.bind). – Corbin
@ kalisjoshua, да, вы использовали много больших слов, что привело меня в замешательство, хотя вы пытались объяснить это ясно. У вас есть способ сделать это на простом английском языке и проиллюстрировать, что вы подразумеваете под примерами? «return ... call function (f) с заданными аргументами (o), заданными как контекст«, »return function (f) с контекстом (o)», «return ... вызов функции (f) с помощью context (o) "не настолько ли они похожи друг на друга? – user1386284
Что касается приложения частичной функции, как следует из названия, зачем вам нужно все еще перечислять 3 аргумента, добавляя нулевой объект? В этом случае, если ни один не указывает на человека, «Джошуа» относится к действию, а «говорит» относится к сообщению? – user1386284