Любую функцию в яваскрипт можно вызвать в контексте любого объекта.
Используя 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]
Автор: dtmax (не зарегистрирован), дата: 1 октября, 2009 - 19:20
#permalinkСпасибо, статья помогла разобраться. Вот пример, может кому-то станет понятнее.
window.name = 'окошко';
var test = function () {alert(this.name);}
test(); //->окошко, т.к. функция объявлена в контексте window
var obj = {
name: 'объектик',
fx: function() {
test();//->окошко, т.к. функция объявлена в контексте window
test.apply(this);//->объектик, т.к. мы вызвали функцию в нужном нам контексте
}
}
obj.fx();
Автор: Гость (не зарегистрирован), дата: 27 ноября, 2009 - 07:11
#permalink(не только к этой статье)
Для функций, добавьте плз перед разделом "Синтаксис" краткий раздел "Описание", где в одном предложении говорится, что делает функция.
Автор: Alexander Shabanov (не зарегистрирован), дата: 12 мая, 2010 - 18:38
#permalink(мой кросспост с РСДНа) вот забавный пример:
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!
Автор: BlackScorp (не зарегистрирован), дата: 18 мая, 2010 - 10:05
#permalinkДля правильности отработки функций Alexander Shabanov нужно передавать параметры так:
typeof("asd"); //<strong>Вернет "string"</strong> var f = function() { return typeof(this.s) }; f.call({s:"asd"}); //<strong>Тоже вернет "string"</strong> (s instanceof String); //<strong>Вернет false</strong> f = function() { return this.s instanceof String }; f.call({s:"asd"}); //<strong>Тоже вернет false</strong>Автор: senkler (не зарегистрирован), дата: 10 мая, 2012 - 19:48
#permalinkArray.prototype._join = Array.prototype.join Array.prototype.join = function() { alert("Меня вызвали! Аргументов:"+arguments.length) return Array.prototype._join.apply(this, arguments) } var arr = [1,2,3]Возвращает function() ?
не понимаю почему так ведет себя fireBug.