Контекст, чтобы использовать вызов и применить в Javascript?
Ребята могут любой объяснить контекст, чтобы использовать call
а также apply
методы в Javascript?
Зачем использовать call
а также apply
вместо непосредственного вызова функции?
6 ответов
Ты используешь call
или же apply
когда вы хотите передать другой this
значение для функции. По сути, это означает, что вы хотите выполнить функцию, как если бы это был метод определенного объекта. Единственная разница между ними состоит в том, что call
ожидает параметры, разделенные запятыми, в то время как apply
ожидает параметры в массиве.
Пример из Мозиллы apply
страница, на которой сконструированы конструкторы:
function Product(name, price) {
this.name = name;
this.price = price;
if (price < 0)
throw RangeError('Cannot create product "' + name + '" with a negative price');
return this;
}
function Food(name, price) {
Product.apply(this, arguments);
this.category = 'food';
}
Food.prototype = new Product();
function Toy(name, price) {
Product.apply(this, arguments);
this.category = 'toy';
}
Toy.prototype = new Product();
var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);
Какие Product.apply(this, arguments)
делает следующее: Product
Конструктор применяется как функция внутри каждого из Food
а также Toy
конструкторы, и каждый из этих экземпляров объекта передается как this
, Таким образом, каждый из Food
а также Toy
теперь есть this.name
а также this.category
свойства.
Только если вы используете call
или же apply
Вы можете изменить this
контекст внутри функции.
В отличие от других языков - в JavaScript this
не относится к текущему объекту - скорее к контексту выполнения и может быть установлено вызывающей стороной.
Если вы вызываете функцию, используя new
ключевое слово this
будет правильно ссылаться на новый объект (внутри функции конструктора)..
Но во всех остальных случаях - this
будет ссылаться на глобальный объект, если он не установлен явно через вызов
Ты используешь .call()
когда вы хотите, чтобы функция выполнялась с другим this
значение. Это устанавливает this
Значение, как указано, устанавливает аргументы, как указано, а затем вызывает функцию. Разница между .call()
и просто выполнение функции является значением this
указатель при выполнении функции. Когда вы выполняете функцию нормально, javascript решает, что this
указатель будет (обычно глобальный контекст window
если функция не вызывается как метод объекта). Когда вы используете .call()
, вы указываете именно то, что вы хотите this
быть установленным в.
Ты используешь .apply()
когда аргументы, которые вы хотите передать функции, находятся в массиве. .apply()
может также заставить функцию выполняться с определенным this
значение. .apply()
чаще всего используется, когда у вас есть неопределенное количество аргументов, поступающих из какого-либо другого источника. Часто используется также передача аргументов от одного вызова функции другому с помощью специальной локальной переменной arguments
который содержит массив аргументов, которые были переданы вашей текущей функции.
Я считаю полезными справочные страницы MDN для .call() и .apply().
Если у вас есть опыт работы с jQuery, вы будете знать, что большинство функций используют this
объект. Например, collection.each(function() { ... });
Внутри этой функции "this"
ссылается на объект итератора. Это одно из возможных применений.
Я лично использовал .apply()
для реализации очереди запросов - я помещаю массив аргументов в очередь, а когда приходит время для его выполнения, я беру элемент и передаю его в качестве аргументов для функции-обработчика, используя .apply()
, таким образом, делая код более чистым, если необходимо передать массив аргументов в качестве первого аргумента. Это еще один пример.
В общем, просто имейте в виду, что такие способы вызова функции существуют, и однажды вы можете найти их удобными для использования в своей программе.
Если у вас есть опыт работы с Object Oriented Programming
тогда вызов и применение будет иметь смысл, если вы сравните его с наследованием и переопределите свойства или метод / функции родительского класса из дочернего класса. Что похоже на вызов в JavaScript следующим образом:
function foo () {
this.helloworld = "hello from foo"
}
foo.prototype.print = function () {
console.log(this.helloworld)
}
foo.prototype.main = function () {
this.print()
}
function bar() {
this.helloworld = 'hello from bar'
}
// declaring print function to override the previous print
bar.prototype.print = function () {
console.log(this.helloworld)
}
var iamfoo = new foo()
iamfoo.main() // prints: hello from foo
iamfoo.main.call(new bar()) // override print and prints: hello from bar
Я не могу вспомнить ни одной нормальной ситуации, в которой установка thisArg на что-то другое является целью применения apply.
Цель применения - передать массив значений в функцию, которая хочет эти значения в качестве аргументов.
Он был заменен при обычном ежедневном использовании оператором спреда.
например
// Finding the largest number in an array
`Math.max.apply(null, arr)` becomes `Math.max(...arr)`
// Inserting the values of one array at the start of another
Array.prototype.unshift.apply(arr1, arr2);
// which becomes
arr1 = [...arr2, ...arr1]