Контекст, чтобы использовать вызов и применить в 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]
Другие вопросы по тегам