В чем разница между вызовом и применением свойства при вызове функции

Способы вызова функции

Есть 3 способа выполнить функцию в JavaScript. Имея следующую обратную функцию (эта функция возвращает обратную строку):

var reverse = function(text){
return text.split("").reverse().join("");
};
// Or
function reverse(text){
return text.split("").reverse().join("");
}

Мы могли бы выполнить это как:

позвонить собственности

Свойство call позволяет вам выполнять функцию и изменять this контекст правильно, за которым следуют специфические параметры, разделенные запятой, как вы это обычно делаете с обычной функцией.

var animals = [
{ species: 'Lion', name: 'King' },
{ species: 'Whale', name: 'Fail' }
];
for (var i = 0; i < animals.length; i++) {
(function(i) {
this.print = function() {
console.log('#' + i + ' ' + this.species
+ ': ' + this.name);
}
this.print();
}).call(animals[i], i);// Change the this context to the animal object
}

применить собственность

применить очень похоже на call, за исключением типа аргументов, которые он поддерживает. Вы можете использовать массив аргументов вместо именованного набора параметров. С помощью apply вы можете использовать литерал массива или переменную массива.

Следующий пример переопределяет метод console.log. Однако мы хотим сделать то же самое, что и console.log, но что-то до и после, поэтому мы используем apply выполнить оригинальный метод console.log, чтобы нам не нужно было беспокоиться о положении аргументов, поскольку они будут отправлены так же, как они пришли. Обратите внимание, что переменная arguments является массивом.

var originalLog = console.log;
console.log = function() {
// Do something your before execute something
AnImaginaryFunctionThatDoesSomething(arguments);
// Call the function as it would have been called normally:
// Note that with apply we change the this context and send
originalLog.apply(this, arguments);
// Run another thing after the original console.log
};

выполнить напрямую

Ничто не сломается, если выполнить функцию напрямую, если вы решите вызвать функцию напрямую. Однако вы не можете изменить this контекст и параметры всегда будут ограничены так же, как свойство call.

Вам нужно только проверить, является ли переменная функцией перед вызовом.

if(typeof(reverse) === "function"){
reverse("otto");
}

В чем разница

Вы не получили разницу между ними с предыдущими примерами? Нет проблем, разница между apply и call очень проста. Смотрите следующий пример:

var teacher = function(name, age, area) {
console.log("My name is " + name + ", i'm "+age+" years old and i'm a " + area + " teacher. The context of this is " + this);
};
teacher("John", 20, "History");
teacher.apply(true, ["Patty",23,"Music"]);
teacher.call(undefined, "Bruce", 44 ,"Mathematics");
// Outputs
//My name is John, i'm 20 years old and i'm a History teacher. The context of this is [undefined]
//My name is Patty, i'm 23 years old and i'm a Music teacher. The context of this is [true]
//My name is Bruce, i'm 44 years old and i'm a Mathematics teacher. The context of this is [undefined]

Они выполняют ту же задачу, выполняют функцию. Единственная разница заключается в том, как аргументы могут быть отправлены и сколько аргументов может быть предоставлено..

  • применять, вызов или же ссылаться напрямую функция, просто выполнит это , с или без аргументов.
  • this контекст может быть изменен только в методах apply и call.
  • Непосредственный вызов функции или использование вызова не допускает динамических параметров, поэтому они явно объявлены (если объявлено 5 параметров, будет отправлено только 5).
  • Использование apply позволяет отправлять динамические параметры в функцию (ограниченные параметры, если массив в качестве второго параметра имеет 500 элементов, то функция получит соответственно 500 элементов массива в качестве параметров).

Помните, что первый и второй параметр apply() а также call() необязательны, не обязательны. Поэтому они являются просто еще одним способом выполнения функции, но с разрешенной настройкой. Поэтому нет рекомендуемого способа выполнения функции, так как тот, который вы выбираете, должен соответствовать вашим потребностям.

Ссылка на основную публикацию
Adblock
detector