Любую функцию в яваскрипт можно вызвать в контексте любого объекта.
Используя apply
, вы можете вызывать одну функцию в контексте множества различных объектов.
Метод apply
очень похож на call, за исключением передачи аргументов. В apply
используется массив аргументов вместо списка именованных параметров.
Используя apply
, вы можете использовать литеральное объявление массива, например fun.apply(this, [name, value])
.
Вы также можете использовать arguments в качестве параметра argArray
. Это избавляет от необходимости знать, с какими параметрами была вызвана исходная функция.
Это используется во множестве паттернов проектирования. Например, для вызова метода родителя в ООП или для создания обертки, как в примере ниже:
Пример: Подменяем метод на такой же, но с логированием
// метод join будет теперь сообщать о каждом вызове
Array.prototype._join = Array.prototype.join
Array.prototype.join = function() {
alert("Меня вызвали! Аргументов:"+arguments.length)
return Array.prototype._join.apply(this, arguments)
}
var arr = [1,2,3]
Спасибо, статья помогла разобраться. Вот пример, может кому-то станет понятнее.
window.name = 'окошко';
var test = function () {alert(this.name);}
test(); //->окошко, т.к. функция объявлена в контексте window
var obj = {
name: 'объектик',
fx: function() {
test();//->окошко, т.к. функция объявлена в контексте window
test.apply(this);//->объектик, т.к. мы вызвали функцию в нужном нам контексте
}
}
obj.fx();
Спасибо за интересный пример, он-то мне и помог понять что к чему.
dtmax, спасибо! Ваш пример для меня намного понятнее, чем в статье
в статье, по большей части, объясняют отличия apply от call, а том что вам стало понятно из примера, объясняют в описании call
ВОТ ОН, тот нужный пример!
Спасибо! А то я долго въехать не мог и до этого не замечал этот комментарий!
Спасибо еще раз! = )
Спасибо за пример.
Наглядно и прозрачно.
Я вот немного дополнил и расширил Ваш пример:
window.name = 'window';
var func = function () {
console.log(this.name);
}
func(); // 'window' т.к. функция объявлена в контексте window
var obj = {
name: 'Object obj',
otherFunc: function () {
console.log(this.name);
},
fnc: function() {
func();// 'window' т.к. функция объявлена в контексте window
func.apply(this);// 'Object obj' т.к. мы вызвали функцию в контексте обьекта obj
// console.log('obj: [');
func.apply(obj);// 'Object obj' т.к. мы вызвали функцию в контексте обьекта obj
// console.log(']');
this.otherFunc();
}
}
obj.fnc();
obj.otherFunc();
obj.otherFunc.apply(this);
obj.otherFunc.apply(document);
(не только к этой статье)
Для функций, добавьте плз перед разделом "Синтаксис" краткий раздел "Описание", где в одном предложении говорится, что делает функция.
(мой кросспост с РСДНа) вот забавный пример:
typeof("asd") вернет "string"
а вот если сделать так:
var f = function() { return typeof(this) }
то
f.call("asd") вернет "object"!
более того, если
f = function() { return this instanceof String }
то
f.call("asd") вернет true
в то же время
("asd" instanceof String) вернет false!
Для правильности отработки функций Alexander Shabanov нужно передавать параметры так:
Или так
BlackScorp
Возвращает function() ?
не понимаю почему так ведет себя fireBug.