Любую функцию в яваскрипт можно вызвать в контексте любого объекта.
Используя 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();
Спасибо за интересный пример, он-то мне и помог понять что к чему.
(не только к этой статье)
Для функций, добавьте плз перед разделом "Синтаксис" краткий раздел "Описание", где в одном предложении говорится, что делает функция.
(мой кросспост с РСДНа) вот забавный пример:
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 нужно передавать параметры так:
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>Или так
var s="asd"; typeof(s); //Вернет "string" var f = function() { return typeof(this.s) }; f.call(); //Тоже вернет "string" (s instanceof String)); //Вернет false f = function() { return this.s instanceof String }; f.call(); //Тоже вернет falseОтправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.