я уже знаю, что apply
и call
есть аналогичные функции, которые устанавливают this
(контекст функции).
Разница в том, как мы отправляем аргументы (вручную против массива)
Вопрос:
Но когда я должен использовать bind()
метод?
var obj = {
x: 81,
getX: function() {
return this.x;
}
};
alert(obj.getX.bind(obj)());
alert(obj.getX.call(obj));
alert(obj.getX.apply(obj));
javascript
arrays
function
Ройи Намир
источник
источник
call()
вами передают аргументы индивидуально иapply()
как массив аргументов. Для более подробной информации ознакомьтесь со связанной документацией, которая должна быть в состоянии полностью ответить на ваш вопрос.kind of weird there is not an existing question about this :
По этому поводу. Это, вероятно, потому чтоbind()
был добавлен после того, как два других уже существовали в JavaScript 1.8.5 - ECMA-262, 5-е издание. В то время какcall()
иapply()
был с JavaScript 1.3 - ECMA-262 3-е издание. У SO есть такие вопросы, как: что такое разница между вызовом и применением . Я только догадываюсь, хотя, как мне было интересно, что сам.Ответы:
Я создал это сравнение между объектами функций, вызовами функций
call/apply
иbind
некоторое время назад:.bind
позволяет вам установитьthis
значение сейчас, одновременно выполняя функцию в будущем , потому что она возвращает новый объект функции.источник
Используйте,
.bind()
если вы хотите, чтобы эта функция впоследствии вызывалась в определенном контексте, что полезно в событиях. Используйте.call()
или,.apply()
если вы хотите немедленно вызвать функцию, и измените контекст.Call / apply вызывает функцию немедленно, тогда как
bind
возвращает функцию, которая при последующем выполнении будет иметь правильный контекст, установленный для вызова исходной функции. Таким образом, вы можете поддерживать контекст в асинхронных обратных вызовах и событиях.Я делаю это много:
Я широко использую его в Node.js для асинхронных обратных вызовов, для которых я хочу передать метод member, но все же хочу, чтобы контекст был экземпляром, который запустил асинхронное действие.
Простая, наивная реализация bind будет выглядеть так:
Это еще не все (например, передача других аргументов), но вы можете прочитать об этом больше и увидеть реальную реализацию в MDN. .
Надеюсь это поможет.
источник
bind
возвращается.Все они присоединяют это к функции (или объекту), и разница заключается в вызове функции (см. Ниже).
call присоединяет это к функции и немедленно выполняет функцию:
bind присоединяет это к функции, и его нужно вызывать отдельно, например так:
или вот так:
apply аналогично call, за исключением того, что он принимает массивоподобный объект вместо перечисления аргументов по одному:
источник
"use strict"
чтобы избежать переопределения таких зарезервированных ключевых слов. +1.Примеры «Применить против колла» против «Привязки»
Вызов
Применять
привязывать
Когда использовать каждый
Звоните и применяйте довольно взаимозаменяемо. Просто решите, проще ли отправить массив или список аргументов через запятую.
Я всегда помню, какой из них, помня, что Call для запятой (разделенный список) и Apply для Array.
Привязка немного отличается. Возвращает новую функцию. Вызвать и применить немедленно выполнить текущую функцию.
Bind отлично подходит для многих вещей. Мы можем использовать его для карри функций, как в примере выше. Мы можем взять простую функцию hello и превратить ее в helloJon или helloKelly. Мы также можем использовать его для таких событий, как onClick, когда мы не знаем, когда они будут запущены, но мы знаем, какой контекст мы хотим, чтобы они имели.
Ссылка: codeplanet.io
источник
call
иapply
означает ли это, что если у вас нетthis
метода внутри, то вы бы назначили первый аргумент какnull
?var person1 = {firstName: 'Jon', lastName: 'Kuperman'}; function say(greeting) { console.log(greeting + ' ' + this.firstName + ' ' + this.lastName); } say.apply(person1, ['Hello']); // Hello Jon Kuperman
Отлично работает и выдает VM128: 4 Привет Джон КуперманЭто позволяет устанавливать значение
this
независимо от того, как вызывается функция. Это очень полезно при работе с обратными вызовами:Чтобы достичь того же результата
call
, выглядело бы так:источник
.bind()
что вы показали ранее, неверно. При использованииfn.bind(obj)
другой функции будет возвращено (не то, что вы создали ранее). И нет никаких возможностей изменить значениеthis
внутриbinded
функции. В основном это используется дляthis
страхования обратных вызовов . Но в вашем примере - нет различий в результате. Ноfn !== fn.bind(obj);
обратите внимание на это.Предположим, у нас есть
multiplication
функцияДавайте создадим несколько стандартных функций, используя
bind
var multiby2 = multiplication.bind(this,2);
Теперь multiby2 (b) равно умножению (2, b);
Что делать, если я передаю оба параметра в привязке
Теперь getSixAlways () равен умножению (3,2);
четный передаваемый параметр возвращает 6;
getSixAlways(12); //6
Это создаст новую функцию умножения и назначит ее magicMultiplication.
О нет, мы скрываем функциональность умножения в magicMultiplication.
вызов
magicMultiplication
возвращает пустоеfunction b()
на исполнении все работает отлично
magicMultiplication(6,5); //30
Как насчет звонить и подать заявку?
magicMultiplication.call(this,3,2); //6
magicMultiplication.apply(this,[5,2]); //10
Проще говоря,
bind
создает функциюcall
иapply
выполняет функцию, тогда какapply
ожидает параметры в массивеисточник
bind
создает функциюcall
иapply
выполняет функцию, в тоapply
время как ожидает параметры в массиве»И то
Function.prototype.call()
и другоеFunction.prototype.apply()
вызывает функцию с заданнымthis
значением и возвращает возвращаемое значение этой функции.Function.prototype.bind()
с другой стороны, создает новую функцию с заданнымthis
значением и возвращает эту функцию, не выполняя ее.Итак, давайте возьмем функцию, которая выглядит следующим образом:
Теперь давайте возьмем объект, который выглядит следующим образом:
Мы можем привязать нашу функцию к нашему объекту следующим образом:
Теперь мы можем запустить в
Obj.log
любом месте нашего кода:Когда это действительно становится интересным, это когда вы не только связываете значение для
this
, но и для его аргументаprop
:Теперь мы можем сделать это:
источник
bind : связывает функцию с предоставленным значением и контекстом, но не выполняет функцию. Для выполнения функции необходимо вызвать функцию.
Вызов : он выполняет функцию с предоставленным контекстом и параметром.
apply : выполняет функцию с предоставленным контекстом и параметром в виде массива .
источник
Вот одна хорошая статья, чтобы проиллюстрировать разницу между ними
bind()
,apply()
иcall()
подвести итог, как показано ниже.bind()
позволяет нам легко установить, какой конкретный объект будет связан с этим при вызове функции или метода.bind()
позволяют нам брать методыОдна из проблем этого примера заключается в том, что мы добавляем новый метод
showData
кcars
объекту, и мы можем не захотеть делать это просто для того, чтобы заимствовать метод, потому что объект cars может уже иметь имя свойства или методаshowData
. Мы не хотим перезаписывать это случайно. Как мы увидим в нашем обсужденииApply
иCall
ниже, лучше всего заимствовать метод, используя либо метод,Apply
либоCall
.bind()
позвольте нам выполнить функциюФункция Curry , также известная как частичное применение функции , - это использование функции (которая принимает один или несколько аргументов), которая возвращает новую функцию с некоторыми из уже установленных аргументов.
Мы можем использовать,
bind()
чтобы карри этуgreet
функциюapply()
илиcall()
установить это значениеapply
,call
Иbind
методы все используются , чтобы установить это значение при вызове методы, и они делают это по - разному , что позволяет использовать прямой контроль и гибкость в нашем коде JavaScript.apply
Иcall
методы почти идентичны при установке этого значения , за исключением , что вы передаете параметры функции вapply ()
качестве массива , в то время как вы должны перечислить параметры индивидуальны для передачи их вcall ()
метод.Вот один пример, чтобы использовать
call
илиapply
установить это в функции обратного вызова.Заимствовать функции с
apply
илиcall
Заимствовать методы массива
Давайте создадим
array-like
объект и заимствуем некоторые методы массива для работы с нашим массивоподобным объектом.Другой распространенный случай - преобразование
arguments
в массив следующим образомБрать другие методы
Используйте
apply()
для выполнения переменной арности функцииЭто
Math.max
один пример функции переменной арности,Но что, если у нас есть массив чисел для передачи
Math.max
? Мы не можем сделать это:Вот где
apply ()
метод помогает нам выполнять различные функции . Вместо вышеупомянутого мы должны передать массив чисел, используяapply (
) таким образом:источник
call / apply немедленно выполняет функцию:
bind не выполняет функцию сразу, но возвращает упакованную функцию apply (для последующего выполнения):
источник
Синтаксис
Вот
источник
Основное различие между Call, Apply и Bind:
Привязка будет использоваться, если вы хотите, чтобы ваш контекст выполнения появился позже на картинке.
Пример:
Допустим, я хочу использовать этот метод в какой-то другой переменной
Чтобы использовать ссылку на автомобиль в другой переменной, вы должны использовать
Давайте поговорим о более широком использовании функции привязки
Почему? Потому что теперь func связан с Number 1, и если мы не будем использовать bind, в этом случае он будет указывать на Global Object.
Call, Apply используются, когда вы хотите выполнить инструкцию одновременно.
источник
Звоните, применяйте и связывайте. и как они отличаются.
Позволяет учиться звонить и применять, используя любую ежедневную терминологию.
У вас есть три автомобиля,
your_scooter , your_car and your_jet
которые запускаются с одинаковым механизмом (методом). Мы создали объектautomobile
с методомpush_button_engineStart
.Позволяет понять, когда это вызов и применить используется. Предположим, что вы инженер, и у вас есть
your_scooter
,your_car
иyour_jet
который не поставляется с push_button_engine_start, и вы хотите использовать третье лицоpush_button_engineStart
.Если вы запустите следующие строки кода, они выдадут ошибку. ПОЧЕМУ?
Таким образом, приведенный выше пример успешно предоставляет your_scooter, your_car, your_jet функцию из автомобильного объекта.
Давайте погрузимся глубже. Здесь мы разделим вышеприведенную строку кода.
automobile.push_button_engineStart
помогает нам получить используемый метод.Далее мы используем apply или call с использованием точечной нотации.
automobile.push_button_engineStart.apply()
Теперь примените и вызовите принять два параметра.
Итак, здесь мы устанавливаем контекст в последней строке кода.
automobile.push_button_engineStart.apply(your_scooter,[20])
Разница между call и apply заключается в том, что apply принимает параметры в виде массива, в то время как call может просто принимать список аргументов через запятую.
что такое функция JS Bind?
Функция связывания в основном связывает контекст чего-либо, а затем сохраняет его в переменной для выполнения на более позднем этапе.
Давайте сделаем наш предыдущий пример еще лучше. Ранее мы использовали метод, принадлежащий автомобильному объекту, и использовали его для оснащения
your_car, your_jet and your_scooter
. Теперь давайте представим, что мы хотим отдатьpush_button_engineStart
отдельное, чтобы запускать наши автомобили индивидуально на любой последующей стадии исполнения, которую мы желаем.все еще не удовлетворены?
Давайте сделаем это ясно, как слеза. Время экспериментировать. Мы вернемся к вызову и применим функцию application и попытаемся сохранить значение функции в качестве ссылки.
Приведенный ниже эксперимент не удался, потому что call и apply вызываются немедленно, следовательно, мы никогда не доберемся до стадии сохранения ссылки в переменной, где функция bind перехватывает показ
var test_function = automobile.push_button_engineStart.apply(your_scooter);
источник
Call: call вызывает функцию и позволяет передавать аргументы один за другим.
Apply: Apply вызывает функцию и позволяет передавать аргументы в виде массива.
Bind: Bind возвращает новую функцию, позволяющую передавать массив this и любое количество аргументов.
источник
call (): - Здесь мы передаем аргументы функции индивидуально, а не в формате массива.
apply (): - Здесь мы передаем аргументы функции в формате массива
bind (): -
источник
JavaScript Call ()
JavaScript применяется ()
** вызов и применение функции являются разностным вызовом, принимают отдельный аргумент, но применяют массив массива, например: [1,2,3] **
JavaScript bind ()
источник
Представь, привязка недоступна. Вы можете легко построить это следующим образом:
источник
источник
Основной концепцией всех этих методов является функция рытья .
Заимствование функций позволяет нам использовать методы одного объекта на другом объекте без необходимости делать копию этого метода и хранить его в двух разных местах. Это достигается с помощью. вызов() , . применить () или. bind (), все из которых существуют, чтобы явно установить это для метода, который мы заимствуем
Ниже приведен пример всех этих методов
ВЫЗОВ
ПРИМЕНЯТЬ
BIND
printMyNAme () - это функция, которая вызывает функцию
ниже ссылка для jsfiddle
https://codepen.io/Arham11/pen/vYNqExp
источник
Я думаю, что одни и те же места: все они могут изменять значение функции this. Различия между ними: функция bind вернет новую функцию в результате; методы call и apply сразу же выполнят функцию, но apply может принять массив в качестве параметров и проанализировать разделенный массив. А также, функция bind может быть Curry.
источник
Функция связывания должна использоваться, когда мы хотим назначить функцию с определенным контекстом, например.
в приведенном выше примере, если мы вызываем функцию demo.setValue () и передаем функцию this.getValue напрямую, то она не вызывает функцию demo.setValue напрямую, поскольку this в setTimeout ссылается на объект окна, поэтому нам нужно передать контекст демо-объекта в this.getValue Функция с использованием связывания. это означает, что мы только передаем функцию в контексте демонстрационного объекта, а не вызываем функцию.
Надеюсь, ты понимаешь.
Для получения дополнительной информации, пожалуйста, обратитесь к функции привязки javascript.
источник