Оригинальная ссылка:Как использовать методы apply(💅), call(📞) и bind(➰) в JavaScript
Оригинальный автор:Ashay Mandwarya
Переводчик:JintNiu
Рекомендуемая причина:apply
,call
а такжеbind
Они часто встречаются на собеседованиях и ежедневном кодировании, и становится особенно важным понять и освоить их использование.
В этой статье мы обсудим цепочку прототипов функций вapply
,call
а такжеbind
методы, ониJavaScript
наиболее важные и часто используемые понятия вthis
Ключевые слова тесно связаны.
Поэтому, чтобы понять то, что описано в этой статье, вы должны быть знакомы сthis
Понятие и использование ключевых слов. может относиться кэта статья.
Примечание переводчика: см.:Это руководство по JavaScript
чтобы понятьapply
|call
|bind
, нам сначала нужно понятьJavaScript
серединаFunction
, конечно, предпосылка, что вы можете использовать клинкерthis
.
Functions
Function
Конструктор создает новыйFunction
объект. Если вы вызываете конструктор напрямую, вы можете динамически создать функцию в глобальной области видимости.
существуетJavaScript
, функция — это объект, который может бытьapply
,call
а такжеbind
способ вызова.
Чтобы проверить, является ли функцияFunction
объект, мы можем использовать следующий код, чтобы судить, фрагмент кода возвращаетtrue
.
(function () { }).constructor === Function ? console.log(true) : console.log(false);
Глобальный
Function
Объекты не имеют собственных методов или свойств. Но поскольку это сама функция, к ней можно получить доступ с помощьюFunction.prototype
Цепочка прототипов наследует некоторые методы и свойства. — МДН
Вот методы в цепочке прототипов функций:
Function.prototype.apply()
Function.prototype.bind()
Function.prototype.call()
Function.prototype.isGenerator()
Function.prototype.toSource()
Object.prototype.toSource
Function.prototype.toString()
Object.prototype.toString
В этой статье мы обсудим только первые три.
Подать заявку 💅
apply()
Является важным методом в прототипе функции, используется для вызова других функций, параметры задаютсяthis
и массив (или подобный массиву объект).
Массивоподобные объекты могут ссылаться наNodeList
или внутри функцииarguments
объект.
Это означает, что мы можем вызвать любую функцию и явно указать, когдаthis
указывает на.
грамматика
function.apply(this,[argumentsArray])
возвращаемое значение
вернутьthis
Указывает на результат вызова функции.
описывать
apply()
способ сделать объектx
Функция/объект может использоваться другим объектомy
передача.
пример
1.
var array = ['a', 'b'];
var elements = [1, 2, 3];
array.push(elements);
console.log(array); // ['a', 'b', [1, 2, 3]]
В приведенном выше коде, когда мы помещаем массивpush
При вводе другого массива весь массив рассматривается как один элемент напрямуюpush
входить. Но если мы хотим преобразовать массивelemennts
элементы вpush
в массивarray
в? Конечно, есть много способов сделать это, здесь мы используемapply()
.
var array = ['a', 'b'];
var elements = [1, 2, 3];
array.push.apply(array, elements);
console.log(array); // ["a", "b", 1, 2, 3]
В этом примере используйтеapply
объединяет данный массив, аргумент является массивомelements
,this
указать на переменнуюarray
, который реализует массивelements
Элементы вpush
Войтиthis
объект указал на (array
)середина. Окончательный возвращаемый результат состоит в том, что каждый элемент во втором массивеpush
Войтиthis
указано в массиве.
2.
var numbers = [53, 65, 25, 37, 78];
console.log(Math.max(numbers)); //NaN
JS
серединаmax
Функция используется для нахождения максимального значения для данного элемента. Но, как мы видим, если заданное значение является массивом, возвращаемый результат равенNaN
. Конечно,JavaScript
Есть много способов решить эту проблему, здесь мы используемapply
.
var numbers = [53, 65, 25, 37, 78];
console.log(Math.max.apply(null, numbers)); //78
когда мы используемapply
передачаMath.max()
, ожидаемый результат был получен.apply
Будуnumbers
Все значения в виде отдельных параметров перед вызовомmax
Обработать и, наконец, вернуть наибольшее значение в массиве.
Примечательно, что мы используемnull
вместоthis
. Поскольку предоставленный аргумент представляет собой массив чисел, даже если он используетсяthis
, он по-прежнему будет указывать на тот же массив и в конечном итоге даст тот же результат. Поэтому в данном случае можно опуститьthis
, используйте вместоnull
заменять. То есть,apply
в функцииthis
Параметр является необязательным параметром.
Звоните 📞
call()
метод используется для вызова функции с заданными параметрамиthis
и несколько индивидуально заданных последовательностей параметров.
Это означает, что мы можем вызвать любую функцию и явно указать, когдаthis
указывает на.
Это то же самое, чтоapply
очень похоже, единственное отличиеapply
принимает аргументы в виде массивов или массивоподобных объектов, аcall
Параметры предоставляются отдельно.
грамматика
function.call(thisArg,arg1,arg2,...)
возвращаемое значение
вернутьthis
Указывает на результат вызова функции с заданными аргументами.
описывать
call()
способ сделать объектx
Функция/объект может быть вызвана объектомy
передача.
пример
1.
function Product(name, price) {
this.name = name;
this.price = price;
}
function Pizza(name, price) {
Product.call(this, name, price);
this.category = 'pizza';
}
function Toy(name, price) {
Product.call(this, name, price);
this.category = 'toy';
}
var pizza = new Pizza('margherita', 50);
var toy = new Toy('robot', 40);
console.log(toy); // Toy {name: "robot", price: 40, category: "toy"}
console.log(pizza); // Pizza {name: "margherita", price: 50, category: "pizza"}
Это пример цепочки конструкторов. Как видите, каждая функция вызываетсяProduct
конструктор и использоватьcall
БудуProduct
Свойства объекта такие же, какPizza
а такжеToy
связаны.
при созданииPizza
а такжеToy
экземпляр объекта и вывод, результат показывает, что он имеетname
,price
а такжеcategory
три свойства, но мы определили толькоcategory
атрибут. в то время как атрибутыname
а такжеprice
потому что это ужеProduct
объект определен и применен, что может бытьProduct
Получены связанные конструкторы объекта. Наследование может быть достигнуто путем небольшого изменения приведенного выше кода.
2.
function sleep(){
var reply=[this.animal,'typically sleep between',this.sleepDuration].join(' ');
console.log(reply); // I typically sleep between 12 and 16 hours
}
var obj={
animal:'I',sleepDuration:'12 and 16 hours'
};
sleep.call(obj);
В приведенном выше коде мы определяемsleep
функция, содержащая массивreply
, массив состоит изthis
Состоит из элементов, полученных в результате адресации атрибутов, которые определены в отдельных объектах вне функции.
Функции вызоваsleep
, параметры которогоobj
. можно увидетьthis.animal
а такжеthis.sleepDuration
взятые отдельноobj
свойства и выведите полное предложение.
Привязать➰
когда
bind()
При вызове метода создается новая функция с первым параметромthis
и предоставить заданную последовательность аргументов при вызове новой функции. — МДН
Примечание переводчика:
bind()
Метод создаст новую функцию, называемую функцией привязки, когда эта функция привязки вызывается, функция привязки будет передана при ее создании.bind()
Первый параметр методаthis
, второй и последующие параметры, а также параметры самой среды выполнения связанной функции вызывают исходную функцию в том же порядке, что и параметры исходной функции.
грамматика
function.bind(this,arg1,arg2,arg3,...)
возвращаемое значение
вернутьthis
Указывает на результат вызова копии функции, аргументы которой являются заданными аргументами.
описывать
bind
метод сcall
Метод аналогичен, главное отличие в том, чтоbind
возвращает новую функцию, аcall
Не возвращайся.
Согласно спецификации ECMAScript 5,bind
Функция, возвращаемая методом, представляет собой особый тип функционального объекта, называемый связанной функцией (BF). BF содержит исходный функциональный объект, который выполняется при вызове BF.
пример
var x = 9;
var module = {
x: 81,
getX: function () {
return this.x;
}
};
console.log(module.getX()); // 81
var retrieveX = module.getX;
console.log(retrieveX()); // 9
var boundGetX = retrieveX.bind(module);
console.log(boundGetX()); // 81
В приведенном выше коде мы определили переменнуюx
и объектmodule
, в этом объекте также определено свойствоx
и возвращениеx
функция стоимости.
при вызове функцииgetX
Когда он возвращает определение объектаx
, не в глобальной областиx
.
Другая переменная объявляется в глобальной области видимости и называетсяmodule
в объектеgetX
функция. Но поскольку переменная находится в глобальной области видимости,getX
серединаthis
Указывая на глобальную областьx
, который возвращает 9.
Наконец определите другую переменнуюboundGetX
, переменная вызывает функциюretrieveX
, в отличие от предыдущего, на этот раз функцияretrieveX
с объектомmodule
Связывание, возврат - это объектx
ценность . Это потому чтоbind
в функцииthis
указывает на объектx
значение вместо глобальногоx
, поэтому выводится 81.
В заключение
Теперь, когда мы увидели основное использование трех вышеуказанных методов, вы можете задаться вопросом: зачем использовать 3 разных метода для выполнения одной и той же задачи. Чтобы решить эту проблему, вы должны неоднократно практиковаться в том, как их использовать в разных сценариях, и иметь более полное представление о том, когда их использовать и как их лучше использовать, что определенно сделает ваш код более ясным и мощным.
Если вам понравилась эта статья, нажмите Похвалить, добавьте платеж ~