Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.06.2012, 19:46
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

помогите понять
прочитал эту статью http://learn.javascript.ru/arguments
и заинтересовала возможность:
Цитата:
Передача вызова при помощи call/apply
вот линк http://learn.javascript.ru/arguments...и-call-apply
но я не совсем понимаю как это работает, помогите ответить на пару возникших вопросов :
  1. передается только this, или можно получить доступ к переменным который находятся в функции из которой вызвали?
  2. .call - это метод или функция? и зачем он нужен?
заранее спс
Ответить с цитированием
  #2 (permalink)  
Старый 02.06.2012, 19:59
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

https://developer.mozilla.org/en/Jav.../Function/call
https://developer.mozilla.org/en/Jav...Function/apply

Оба метода нужны для того чтобы явно задать контекст this при вызове функции.

Это по сути одно и тоже, только в call аргументы передаются по одному через запятую, а в apply - массивом. Второе удобно использовать когда количество аргументов заранее неизвестно.
Ответить с цитированием
  #3 (permalink)  
Старый 02.06.2012, 20:02
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Сообщение от DreamTheater Посмотреть сообщение
https://developer.mozilla.org/en/Jav.../Function/call
https://developer.mozilla.org/en/Jav...Function/apply

Оба метода нужны для того чтобы явно задать контекст this при вызове функции.

Это по сути одно и тоже, только в call аргументы передаются по одному через запятую, а в apply - массивом. Второе удобно использовать когда количество аргументов заранее неизвестно.
это получается как arguments если из него массив получить..
а что насчет первого вопроса?
Ответить с цитированием
  #4 (permalink)  
Старый 02.06.2012, 20:05
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Первый вопрос я не понял.
Ответить с цитированием
  #5 (permalink)  
Старый 02.06.2012, 20:10
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

вот не совсем понимаю как работает данный код

var user = {
  log: function() {
logService.add.apply(logService, arguments);
  }
}

var logService = {
  add: function() {
    alert( this.format(arguments) );
  },

  format: function(args) {
    return [].join.call(args, ' ');
  }
}

user.log("Вася", "сказал", "что-то умное..");
Ответить с цитированием
  #6 (permalink)  
Старый 02.06.2012, 20:16
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Сообщение от cyber Посмотреть сообщение
вот не совсем понимаю как работает данный код
Что именно непонятно?
Ответить с цитированием
  #7 (permalink)  
Старый 02.06.2012, 20:26
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

logService.add.apply(logService, arguments);

что передается в logService ?
в arguments я так понял псевдо массив arguments.

но в

add: function() {

    alert( this.format(arguments) );
  },

передается arguments через this - вот тут я не пойму как это работает
Цитата:
Обратите внимание, что вызов logService.add.apply(logService, arguments) передал аргументы в функцию logService.add, но при этом сохранил this.
кстати можете обьяснить что такое псевдо массив
Ответить с цитированием
  #8 (permalink)  
Старый 02.06.2012, 20:33
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

при вызове функции у нее есть скрытый аргумент arguments
тоесть
function myfunc() {
    alert( arguments ); // тут массив переданных аргументов
}
myfunc( arg1, arg2 );

при вызове myfunc обычным образом ей передается в качестве контекста то что стоит слева от метода, в нашем случаем:
myfunc();

не имеет ничего слева и по умолчанию функция получает контекст window в обычном режиме или null в строгом режиме.
тоесть:
function myfunc() {
    alert( this ); // window в обычном режиме, null в строгом режиме
}

И что бы функция получила нужный нам контекст, для этого есть два метода, особо сильно они не отличаются, например вызвать функцию и передать ей нужный контекст можно так:
myfunc.call( "Я новый контекст", arg1, arg2 );

и при вызове мы получим:
function myfunc() {
    alert( this ); // "Я новый контекст"
    alert( arguments ); // массив аргументов
}

другой метод apply отличается тем что в него не нужно передавать аргументы списком, а достаточно передать массив аргументов:
myfunc.apply( "Я новый контекст", [ arg1, arg2 ] );

и при вызове мы получим тоже самое:
function myfunc() {
    alert( this ); // "Я новый контекст"
    alert( arguments ); // массив аргументов
}

тоесть apply нам дает возможность вызвать функцию не зная точного количества аргументов, допустим мы перехватываем нашу функцию myfunc но мы не знаем сколько в нее аргументов должно придти
function proxyMyfunc() {
    // делаем нужное действие
    // и вызываем оригинал
    myfunc.apply( this, arguments );
}
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #9 (permalink)  
Старый 02.06.2012, 20:44
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

спасибо за развернутый ответ.
чет голова плохо варит уже, пойду отдохну и вникну=)
еще раз спасибо
Ответить с цитированием
  #10 (permalink)  
Старый 02.06.2012, 21:37
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

function proxyMyfunc() {
    // делаем нужное действие
    // и вызываем оригинал
    myfunc.apply( this, arguments );
}

в данном случае передастся ссылка на обьект proxyMyfunc и псевдо массив arguments!?
и в качестве this в myfunc будет использоваться обьект proxyMyfunc я правильно понял?=)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите понять поведение скрипта demoniqus Общие вопросы Javascript 3 02.03.2012 09:58
помогите понять jquery Xaver jQuery 0 13.04.2011 13:25
Анимация. Помогите понять почему не работает. kadurban jQuery 4 08.07.2010 20:50
Помогите понять куда копать warobushek Общие вопросы Javascript 10 13.05.2010 19:25
Помогите понять что надо "Удобное дерево" Fridrih AJAX и COMET 2 02.04.2010 10:12