Показать сообщение отдельно
  #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
Ответить с цитированием