|
помогите понять
прочитал эту статью http://learn.javascript.ru/arguments
и заинтересовала возможность: Цитата:
но я не совсем понимаю как это работает, помогите ответить на пару возникших вопросов :
|
https://developer.mozilla.org/en/Jav.../Function/call
https://developer.mozilla.org/en/Jav...Function/apply Оба метода нужны для того чтобы явно задать контекст this при вызове функции. Это по сути одно и тоже, только в call аргументы передаются по одному через запятую, а в apply - массивом. Второе удобно использовать когда количество аргументов заранее неизвестно. |
Цитата:
а что насчет первого вопроса? |
Первый вопрос я не понял.
|
вот не совсем понимаю как работает данный код
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("Вася", "сказал", "что-то умное..");
|
Цитата:
|
logService.add.apply(logService, arguments); что передается в logService ? в arguments я так понял псевдо массив arguments. но в
add: function() {
alert( this.format(arguments) );
},
передается arguments через this - вот тут я не пойму как это работает Цитата:
|
при вызове функции у нее есть скрытый аргумент 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 );
}
|
спасибо за развернутый ответ.
чет голова плохо варит уже, пойду отдохну и вникну=) еще раз спасибо |
function proxyMyfunc() {
// делаем нужное действие
// и вызываем оригинал
myfunc.apply( this, arguments );
}
в данном случае передастся ссылка на обьект proxyMyfunc и псевдо массив arguments!? и в качестве this в myfunc будет использоваться обьект proxyMyfunc я правильно понял?=) |
| Часовой пояс GMT +3, время: 04:55. |
|