Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   помогите понять (https://javascript.ru/forum/events/28787-pomogite-ponyat.html)

cyber 02.06.2012 19:46

помогите понять
 
прочитал эту статью http://learn.javascript.ru/arguments
и заинтересовала возможность:
Цитата:

Передача вызова при помощи call/apply

вот линк http://learn.javascript.ru/arguments...и-call-apply
но я не совсем понимаю как это работает, помогите ответить на пару возникших вопросов :
  1. передается только this, или можно получить доступ к переменным который находятся в функции из которой вызвали?
  2. .call - это метод или функция? и зачем он нужен?
заранее спс

DreamTheater 02.06.2012 19:59

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

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

Это по сути одно и тоже, только в call аргументы передаются по одному через запятую, а в apply - массивом. Второе удобно использовать когда количество аргументов заранее неизвестно.

cyber 02.06.2012 20:02

Цитата:

Сообщение от DreamTheater (Сообщение 178305)
https://developer.mozilla.org/en/Jav.../Function/call
https://developer.mozilla.org/en/Jav...Function/apply

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

Это по сути одно и тоже, только в call аргументы передаются по одному через запятую, а в apply - массивом. Второе удобно использовать когда количество аргументов заранее неизвестно.

это получается как arguments если из него массив получить..
а что насчет первого вопроса?

DreamTheater 02.06.2012 20:05

Первый вопрос я не понял.

cyber 02.06.2012 20:10

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

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("Вася", "сказал", "что-то умное..");

DreamTheater 02.06.2012 20:16

Цитата:

Сообщение от cyber (Сообщение 178315)
вот не совсем понимаю как работает данный код

Что именно непонятно?

cyber 02.06.2012 20:26

logService.add.apply(logService, arguments);

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

но в

add: function() {

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

передается arguments через this - вот тут я не пойму как это работает
Цитата:

Обратите внимание, что вызов logService.add.apply(logService, arguments) передал аргументы в функцию logService.add, но при этом сохранил this.
кстати можете обьяснить что такое псевдо массив

devote 02.06.2012 20:33

при вызове функции у нее есть скрытый аргумент 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 );
}

cyber 02.06.2012 20:44

спасибо за развернутый ответ.
чет голова плохо варит уже, пойду отдохну и вникну=)
еще раз спасибо

cyber 02.06.2012 21:37

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

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


Часовой пояс GMT +3, время: 18:03.