Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.03.2013, 11:43
Аспирант
Отправить личное сообщение для xfreewindx Посмотреть профиль Найти все сообщения от xfreewindx
 
Регистрация: 19.08.2012
Сообщений: 33

Вопрос по задачке
Здравствуйте!

Могли бы вы пояснить.
Задача из учебника:

function work(a, b) { 
  alert(a + b); // work - произвольная функция
}

function makeLogging(f, log) { /* ваш код */ }

var log = [];
work = makeLogging(work, log);

work(1, 2); // 3
work(4, 5); // 9

for(var i=0; i<log.length; i++) {
  alert( 'Лог:' + [].join.call(log[i]) ); // "Лог:1,2", "Лог:4,5"
}


Непонятна эта строка, что здесь происходит?
[].join.call(log[i])

func.call(context, arg1, arg2,...)
здесь у нас context = log[i] ???

я что-то запутался в аргументах call/apply, особенно когда у apply/call в скобках всего один аргумент.

Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 23.03.2013, 12:02
Аватар для Илья Кантор
Администратор
Отправить личное сообщение для Илья Кантор Посмотреть профиль Найти все сообщения от Илья Кантор
 
Регистрация: 25.05.2007
Сообщений: 1,221

В строке [].join.call(log[i]) берётся массив [] и его метод join (встроенный) вызывается с this равным log[i].

Внутренний алгоритм join заключается в том, что this[0]...this[length-1] объединяются через запятую (или другой разделитель, если указан).
Ответить с цитированием
  #3 (permalink)  
Старый 23.03.2013, 12:11
Аспирант
Отправить личное сообщение для Ervin Посмотреть профиль Найти все сообщения от Ervin
 
Регистрация: 19.03.2013
Сообщений: 84

[].join.call(log[i]) - Вызывает встроенный метод "join", массива []. Этому методу передаётся массив log[i] и метод join принимает его в виде this.
Тобиш в твоей ситуации:
var log = [[1, 2], [4, 5]];

При первом вызове произойдет следующие:
1)[].join - даст ссылку на встроенный метод "join", массива;
2)join.call([1, 2]) - вызовет этот метод join и задаст внутреннею переменную this = [1, 2]. С этой переменной и произойдут работа "join", который объединит этот массив в строку. Тоже самое если-бы сделать так: [1,2].join("");

Я рекомендую почитать статьи сайта:
1)Call - http://javascript.ru/Function/call
2)Apply - http://javascript.ru/Function/apply
Ответить с цитированием
  #4 (permalink)  
Старый 23.03.2013, 13:08
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Вместо [].join по идее должно быть Array.prototype.join - именно тут этот метод определен.
А почему не просто log[i].join() ?
Ответить с цитированием
  #5 (permalink)  
Старый 23.03.2013, 14:20
Аспирант
Отправить личное сообщение для xfreewindx Посмотреть профиль Найти все сообщения от xfreewindx
 
Регистрация: 19.08.2012
Сообщений: 33

Спасибо за помощь!
С [].join.call(log[i]) разобрался.

У меня просто было решение, в котором log сначала при первом вызове work содержал 1 и 2, при втором вызове 1, 2, 4, 5
и получалось что [].join.call(log[i]) не работал. Я не мог понять
зачем внутри call log[i], ведь на первой итерации log[i] = 1. И поэтому смысл выражения для меня терялся. Буду переделывать.
И да, зачем одалживать метод, ведь log обычный массив?
Ответить с цитированием
  #6 (permalink)  
Старый 23.03.2013, 14:22
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Илья Кантор,
почему ты не запилишь нормальный форум? только домен пропадает

Последний раз редактировалось megaupload, 23.03.2013 в 14:34.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по each() и перебору строк таблицы battrack jQuery 1 09.02.2012 14:30
вопрос про возможности JS для рисования и анимации macdack Библиотеки/Тулкиты/Фреймворки 3 15.07.2011 00:13
Я как ответить на вопрос - есть ли жизнь на других планетах? TicTac Оффтопик 5 28.04.2011 04:29
Теоретический вопрос. gods33 (X)HTML/CSS 10 16.12.2010 23:49
Вопрос про ООП, цепочки прототипов. Shaci Общие вопросы Javascript 5 27.01.2010 14:50