|
помогите понять
прочитал эту статью 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, время: 09:01. |
|