Function apply - garevna/js-course GitHub Wiki
:mortar_board: Биндинг и каррирование
:mortar_board: apply()
Метод apply() отличается от метода call() только способом передачи аргументов - теперь их нужно передавать массивом:
function func () {
console.log ( this.name, arguments )
}
var figure = { name: "figure" }
var sample = { name: "sample" }
func.apply ( figure, [ 9, false, "Hello" ] )
func.apply ( sample, [ 5, 1, "Bye" ] )
Результат в консоли:
figure ► Arguments(3) [ 9, false, "Hello", callee: ƒ, Symbol(Symbol.iterator): ƒ ]
sample ► Arguments(3) [ 5, 1, "Bye", callee: ƒ, Symbol(Symbol.iterator): ƒ ]
Передача массива аргументов вместо перечня их значений обеспечивает определенную гибкость, поскольку массивы передаются по ссылке, и содержимое массива может динамически обновляться от вызова к вызову
:coffee: :two:
var args = [0]
var test = ( function () {
var counter = 0
return function () {
args.push ( this.name )
args[0] = ++counter
}
})()
function func () {
this.test()
var args = Array.from ( arguments )
console.warn ( `Who was called before ${this.name} (${args.splice(0, 1)}):` )
for ( var x of args )
console.info ( x )
}
var figure = { name: "figure", test: test }
var sample = { name: "sample", test: test }
var google = { name: "google", test: test }
func.apply ( figure, args )
func.apply ( sample, args )
func.apply ( google, args )
Результат в консоли:
⚠️ ► Who was called before figure (0):
⚠️ ► Who was called before sample (1):
figure
⚠️ ► Who was called before google (2):
figure
sample
Вызовы функции func логируются в массиве args
При каждом вызове функция func получает в аргументах полный отчет о том, сколько раз она была вызвана до этого, и с каким контекстом
Поменяйте местами вызовы функций, или добавьте повторный вызов любой из функций, и посмотрите результат