Javascript.RU

call

Синтаксис

var result = fun.call(thisArg[, arg1[, arg2[, ...]]])

Аргументы

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

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

Метод call может применяться для вызова функции в контексте нужного объекта:

Пример: Вызов sayName в контексте разных объектов
var Animal1 = {name: 'Cat'}
var Animal2 = {name: 'Dog'}

function sayName() {
    // this — ссылка на объект, в контексте которого вызвана функция
    alert(this.name);
}

sayName.call(Animal1) // выдаст сообщение "Cat"
sayName.call(Animal2) // выдаст сообщение "Dog"

При этом совершенно не важно, какому объекту принадлежит функция. В качестве текущего(this) объекта будет взят первый аргумент.

var Animal1 = {
    name: 'Cat',
    sayName: function() {
        alert(this.name);
    }
};

var Animal2 = {name: 'Dog'};

Animal1.sayName() // выдаст сообщение "Cat"
Animal1.sayName.call(Animal2) // выдаст сообщение "Dog"

Помимо смены контекста вызова, метод call может передавать в функцию аргументы:

var obj = {attr: 10};

function sum(a, b) {
    alert(this.attr + a + b);
}

sum.call(obj, 5, 2) // выдаст сообщение с результатом "17"

Если контекст вызова не указан, то функция будет выполнятся в контексте объекта window:

window.a = 5
function sayThis() {     
     alert(this.a);
}

sayThis.call() // выдаст 5
window.a = 5
function sayThis(b) {     
     alert(this.a + b);
}

sayThis.call(null, 3) // выдаст 8

См. также


Автор: Гость (не зарегистрирован), дата: 13 июня, 2010 - 19:01
#permalink

А в чем отличия между apply и call (кроме способа передачи доп. аргументов)? Как-то не верится, что придумали два одинаковых метода для реализации одного и того же.


Автор: Gozar, дата: 9 ноября, 2010 - 20:38
#permalink

А в чем отличия между apply и call (кроме способа передачи доп. аргументов)? Как-то не верится, что придумали два одинаковых метода для реализации одного и того же.

синтаксический сахар


Автор: INSPIR, дата: 7 апреля, 2011 - 13:47
#permalink

Как минимум этим:
В apply вторым аргументом передаётся массив переменных.
В call - все аргументы через запятую (второй и последующие аргументы не могут быть переданы в виде массива переменных).


Автор: Гость (не зарегистрирован), дата: 24 апреля, 2012 - 08:15
#permalink

// Простая функция, устанавливающая цветовой стиль своего контекста
function changeColor( color ) {
this.style.color = color;
}
// Ее вызов для объекта window, заканчивающийся неудачей, поскольку в нем
// нет объекта style
changeColor( "white" );
// Поиск элемента, ID которого равен main
var main = document.getElementById("main");
// Установка для него черного цвета, используя метод call
// Этот метод устанавливает контекст по первому аргументу, и передает все
// остальные аргументы в качестве аргументов функции
changeColor.call( main, "black" );
// Функция, устанавливающая цвет элемента body
function setBodyColor() {
// Метод apply устанавливает контекст на элемент body, указанный в
// качестве первого аргумента, второй аргумент представляет собой массив
// аргументов, передаваемых функции
changeColor.apply( document.body, arguments );
}
// Установка для элемента body черного цвета
setBodyColor( "black" );


Автор: Павел_Гость (не зарегистрирован), дата: 23 октября, 2012 - 12:00
#permalink

Ребята,

Я новичок в Java скрипт, прошу вашей помощи.

Итак имеется конструктор объекта:

function slider(id)
{
this.bloker = document.getElementById(id);
this.value = 0;


this.DrawBar = function(color, value) //Рабочий метод класса 
{
   this.value += value;

    if (this.value > 148)
   {
     this.value = 148;
   }

this.bloker.style.backgroundColor = color;
this.bloker.style.width = this.value + "px";

if (this.value == 148)
{
this.value = 0 - value;
}

}


this.Timer = function(color, num) // Метод не работает. Как правильно передать 
{
setInterval(function(){DrawBar("red",10).call(this)}, 1000);
}


}

Требуется создать классу метод Timer в котором в функцию setInterval передавать другой метод этого же класса - DrawBar.


Автор: Павел_Гость (не зарегистрирован), дата: 23 октября, 2012 - 12:03
#permalink

Пробовал и так. Нулевой эффект.

this.Timer = function(color, num)
{
setInterval(function(){this.DrawBar(color,num)}, 1000);
}

Автор: Гость (не зарегистрирован), дата: 7 декабря, 2012 - 17:26
#permalink

Внутри setInterval this уже не тот, что вы думаете. Попробуйте в теле верхней функции создать переменную (например, self) и записать в нее this. Внутри же setInterval обращайтесь уже не к this, а к новой переменной (например, self).


Автор: Guest (не зарегистрирован), дата: 19 апреля, 2013 - 00:58
#permalink
class1 =

{
    getMethod: function (m)
    {
        return (function (host, meth, args)
                    {
    	              return function() {meth.apply (host, args); return false}
    	            }) (this, m, [].slice.call (arguments, 1))
    },

    meth1: function (param1, param2)
	{
	},

	meth2: function()
	{
		setInterval (this.getMethod (this.meth1, 'value1', 'value2'), 900)
	},

	meth3: function()
	{
    	document.getElementById('id').onclick = this.getMethod (this.meth1, 'value')
	}
}

Автор: Гость (не зарегистрирован), дата: 30 декабря, 2013 - 17:40
#permalink

В случае call не возможно сформировать список аргументов переменной длинны, в случае apply можно любой массив передать или объект arguments, чтобы передать в функцию аргументы текущей функции.


Автор: transGLUKator (не зарегистрирован), дата: 31 декабря, 2014 - 13:04
#permalink

Мне как-то привели такой пример:

function.call(obj, arg) = obj.function(arg)

Для меня это было самым простым объяснением работы функции call.


Автор: vald (не зарегистрирован), дата: 27 сентября, 2015 - 11:55
#permalink

Привет, а что будет если пытаться вызывать метод без call.
Просто - Array.prototype.toString(['some']);


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

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
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
Антиспам
9 + 3 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Реклама
Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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