Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.08.2011, 12:36
Аспирант
Отправить личное сообщение для Harvey Посмотреть профиль Найти все сообщения от Harvey
 
Регистрация: 19.08.2011
Сообщений: 61

Наболевший this. Не могу понять
Привет, друзья!

В книге "JQuery. Подробное руководство по продвинутому JS" в главе 7 есть пример вспомогательной функции $.formatDate. Не могу понять значение call в этой (8-й)строчке:

result.push($.formatDate.patternValue[matched[0]].call(this,date));


Объясните пожалуйста алгоритм работы этой строки. Не понимаю как здесь работает call

Код всей функции:

(function($){
 $.formatDate = function(date,pattern) {
   var result = [];
   while (pattern.length>0) {
     $.formatDate.patternParts.lastIndex = 0;
     var matched = $.formatDate.patternParts.exec(pattern);
     if (matched) {
       result.push($.formatDate.patternValue[matched[0]].call(this,date));
       pattern = pattern.slice(matched[0].length);
     }
     else {
       result.push(pattern.charAt(0));
       pattern = pattern.slice(1);
     }
   }
   return result.join('');
 };

 $.formatDate.patternParts =
   /^(yy(yy)?|M(M(M(M)?)?)?|d(d)?|EEE(E)?|a|H(H)?|h(h)?|m(m)?|s(s)?|S)/;

 $.formatDate.monthNames = [
   'January','February','March','April','May','June','July',
   'August','September','October','November','December'
 ];

 $.formatDate.dayNames = [
   'Sunday','Monday','Tuesday','Wednesday','Thursday','Friday',
   'Saturday'
 ];

 $.formatDate.patternValue = {
   yy: function(date) {
     return $.toFixedWidth(date.getFullYear(),2);
   },
   yyyy: function(date) {
     return date.getFullYear().toString();
   },
   MMMM: function(date) {
     return $.formatDate.monthNames[date.getMonth()];
   },
   MMM: function(date) {
     return $.formatDate.monthNames[date.getMonth()].substr(0,3);
   },
   MM: function(date) {
     return $.toFixedWidth(date.getMonth()+1,2);
   },
   M: function(date) {
     return date.getMonth()+1;
   },
   dd: function(date) {
     return $.toFixedWidth(date.getDate(),2);
   },
   d: function(date) {
     return date.getDate();
   },
   EEEE: function(date) {
     return $.formatDate.dayNames[date.getDay()];
   },
   EEE: function(date) {
     return $.formatDate.dayNames[date.getDay()].substr(0,3);
   },
   HH: function(date) {
     return $.toFixedWidth(date.getHours(),2);
   },
   H: function(date) {
     return date.getHours();
   },
   hh: function(date) {
     var hours = date.getHours();
     return $.toFixedWidth(hours>12 ? hours - 12 : hours,2);
   },
   h: function(date) {
     return date.getHours()%12;
   },
   mm: function(date) {
     return $.toFixedWidth(date.getMinutes(),2);
   },
   m: function(date) {
     return date.getMinutes();
   },
   ss: function(date) {
     return $.toFixedWidth(date.getSeconds(),2);
   },
   s: function(date) {
     return date.getSeconds();
   },
   S: function(date) {
     return $.toFixedWidth(date.getMilliseconds(),3);
   },
   a: function(date) {
     return date.getHours() < 12 ? 'AM' : 'PM';
   }
 };

 $.toFixedWidth = function(value,length,fill) {
   if (!fill) fill = '0';
   var result = value.toString();
   var padding = length - result.length;
   if (padding < 0) {
     result = result.substr(-padding);
   }
   else {
     for (var n = 0; n < padding; n++) result = fill + result;
   }
   return result;
 };

})(jQuery);
Ответить с цитированием
  #2 (permalink)  
Старый 19.08.2011, 12:59
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

Цитата:
Не понимаю как здесь работает call
как и везде. просто ему обязательно 1-й параметр нужен, а тк в вызываемой функции ничего в контексте не используется в коле можно зис заменить на нул. должно работать.
ЗЫ зис я думаю на бакс ссылается.
ЗЗЫ а в чём проблема проверить самостоятельно?
Ответить с цитированием
  #3 (permalink)  
Старый 19.08.2011, 13:11
Аватар для SkyLight
Злюка-бобер
Отправить личное сообщение для SkyLight Посмотреть профиль Найти все сообщения от SkyLight
 
Регистрация: 21.03.2010
Сообщений: 438

call
__________________
In WEB We Trust
У всех есть своя темная сторона...
Ответить с цитированием
  #4 (permalink)  
Старый 19.08.2011, 14:24
Аспирант
Отправить личное сообщение для Harvey Посмотреть профиль Найти все сообщения от Harvey
 
Регистрация: 19.08.2011
Сообщений: 61

float, спасибо за пример с null, кажется теперь я ближе к пониманию. Но все таки в таком случае смущает наличие первого параметра(null) вообще. Зачем он нужен и как он обрабатывается?

SkyLight, про функцию call прочитал вдоль и поперек на разных ресурсах, но подобных примеров там не было, к сожалению.
Ответить с цитированием
  #5 (permalink)  
Старый 19.08.2011, 15:12
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

Цитата:
Зачем он нужен
Просто такой синтаксис языка
Цитата:
и как он обрабатывается?
в данном случае это просто груз т.к. в функциях $.formatDate.patternValue не используется this.
если передать null, то контекст будет this=window. подробнее описано в статье по ссылке от SkyLight
Ответить с цитированием
  #6 (permalink)  
Старый 19.08.2011, 17:30
Аспирант
Отправить личное сообщение для Harvey Посмотреть профиль Найти все сообщения от Harvey
 
Регистрация: 19.08.2011
Сообщений: 61

float, спасибо!
Ответить с цитированием
  #7 (permalink)  
Старый 19.08.2011, 17:30
Аспирант
Отправить личное сообщение для Harvey Посмотреть профиль Найти все сообщения от Harvey
 
Регистрация: 19.08.2011
Сообщений: 61

упс
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу понять, почему не работает автокомпил в IE 8 gargon2008 jQuery 0 07.06.2011 11:31
RegExp - поиск в найденном. Не могу понять senseysensor Общие вопросы Javascript 9 17.10.2010 21:55
проблема с рекурсией, не могу понять почему скрипт не выходит из неё. Flirer Общие вопросы Javascript 5 24.12.2009 01:01
Не могу понять какая кодировка Andrey Sipin Events/DOM/Window 1 05.10.2009 18:25
не могу понять в чём ошибка scuter Общие вопросы Javascript 2 28.08.2008 15:22