Javascript.RU

apply

Синтаксис

var result = function.apply(thisArg[, argsArray]);

Аргументы

thisArg
Задает значение this внутри функции.
Если thisArg - null или undefined, то это будет глобальный объект.
В ином случае, this будет равно Object(thisArg) (то есть thisArg, если thisArg уже объект, или String, Boolean или Number, если thisArg - примитивное значение соответствующего типа). Таким образом, при выполнении функции всегда соблюдается условие typeof this == 'object'.
argsArray
Массив аргументов, с которыми будет вызвана функция, или null/undefined для вызова без аргументов.

Описание, примеры

Любую функцию в яваскрипт можно вызвать в контексте любого объекта.

Используя 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();


Автор: Гость (не зарегистрирован), дата: 12 декабря, 2011 - 19:51
#permalink

Спасибо за интересный пример, он-то мне и помог понять что к чему.


Автор: ZEOS (не зарегистрирован), дата: 19 июня, 2014 - 14:35
#permalink

dtmax, спасибо! Ваш пример для меня намного понятнее, чем в статье


Автор: Гость (не зарегистрирован), дата: 15 ноября, 2016 - 19:37
#permalink

в статье, по большей части, объясняют отличия apply от call, а том что вам стало понятно из примера, объясняют в описании call


Автор: yesworld, дата: 30 июля, 2014 - 11:49
#permalink

ВОТ ОН, тот нужный пример!
Спасибо! А то я долго въехать не мог и до этого не замечал этот комментарий!

Спасибо еще раз! = )


Автор: Морозов Дмитрий (не зарегистрирован), дата: 1 августа, 2014 - 14:48
#permalink

Спасибо за пример.
Наглядно и прозрачно.

Я вот немного дополнил и расширил Ваш пример:

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);


Автор: Гость (не зарегистрирован), дата: 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>

Автор: BlackScorp (не зарегистрирован), дата: 18 мая, 2010 - 10:12
#permalink

Или так

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

Автор: monolithed, дата: 1 августа, 2012 - 20:19
#permalink

BlackScorp

// 1
var s = new String('a');
s instanceof String; // true

// 2
// this.s вернет undefined, потому что в глобальном объекте нет свойств s
typeof(undefined) // undefined

Автор: senkler (не зарегистрирован), дата: 10 мая, 2012 - 19:48
#permalink
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]

Возвращает function() ?
не понимаю почему так ведет себя fireBug.


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
4 + 13 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Реклама
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum