Справочник javascript: apply

Форум

Учебник Node.JS скринкаст Стандарт языка

Справочник

Discord чат

 
Статьи Тест знаний Аналоги функций PHP  

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


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

#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.


 
Поиск по сайту
Содержание

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

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