Call & Apply

this метода можно изменить при вызове.

Вызов функции и временное присвоение this объекта:

function.call(object)

function.apply(object)

Если в качестве объекта передать null, то для функции в качестве this будет window


var n = 'n in window';

function foo () {
    return this.n;
}
  
const obj = {
    n: 'n in obj'
}
    

foo.call(obj)    // n in obj
foo.apply(obj)   // n in obj

foo.call(null)    // n in window
foo.apply(null)   // n in window
        

Аргументы для функции с Call & Apply

function.call(object, arg0, arg1, arg2)

function.apply(object, [arg0, arg1, arg2])

Кроме изменения this эти два метода могут передавать аргументы. Apply принимает аргументы как массив, а Call - как список.

Пример


/*  Проблема передачи массива в качестве аргумента для Math.max  */
const arr = [10, 20, 30, 90, 80, 70, 60 , 40, 50];
Math.max(10, 20, 30, 90, 80, 70, 60 , 40, 50)  // 90
Math.max(arr)                                  // NaN

/* Решение с помощью apply */
const max = function (array) {
    return  Math.max.apply(Math, array)
};

max(arr)  // 90
         

Пример 2


function addProp (prop, value) {
    this[prop] = value;
}
  
const ann = {
    name: "Ann"
}

addProp.call(ann, "group", "FE1")   
ann.group         // FE1

        
back