2012-05-12 4 views

ответ

3

Вадим и Корбины оба в основном правильно, но добавить немного специфичности и многословия (я говорю громкие слова), 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, и чувствует себя лучше, чем некоторое количество мусора ("" - пустая строка, {} - пустой объект и т. д.). Таким образом, остальные две переменные назначаются в качестве первого набора аргументов функции.

+0

+1 и теперь я чувствую себя глупо. Я как-то полностью пренебрег ветвью 'if (f.bind). – Corbin

+0

@ kalisjoshua, да, вы использовали много больших слов, что привело меня в замешательство, хотя вы пытались объяснить это ясно. У вас есть способ сделать это на простом английском языке и проиллюстрировать, что вы подразумеваете под примерами? «return ... call function (f) с заданными аргументами (o), заданными как контекст«, »return function (f) с контекстом (o)», «return ... вызов функции (f) с помощью context (o) "не настолько ли они похожи друг на друга? – user1386284

+0

Что касается приложения частичной функции, как следует из названия, зачем вам нужно все еще перечислять 3 аргумента, добавляя нулевой объект? В этом случае, если ни один не указывает на человека, «Джошуа» относится к действию, а «говорит» относится к сообщению? – user1386284

1

bind_1 возвращает функцию, которая при вызове выполняет f с o.arguments.

bind_2 немедленно выполняет f с o.arguments.

Что касается «необходимости» этого, то я не могу сразу увидеть. В некотором контексте в коде какого-то человека это, по-видимому, имеет цель.

0

В большинстве случаев это делается для «прикрепления» другого контекста (значение this) к функции.

Смежные вопросы