Вопрос по задачке
Здравствуйте!
Могли бы вы пояснить. Задача из учебника: 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 в скобках всего один аргумент. Спасибо. |
В строке [].join.call(log[i]) берётся массив [] и его метод join (встроенный) вызывается с this равным log[i].
Внутренний алгоритм join заключается в том, что this[0]...this[length-1] объединяются через запятую (или другой разделитель, если указан). |
[].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 |
Вместо [].join по идее должно быть Array.prototype.join - именно тут этот метод определен.
А почему не просто log[i].join() ? |
Спасибо за помощь!
С [].join.call(log[i]) разобрался. У меня просто было решение, в котором log сначала при первом вызове work содержал 1 и 2, при втором вызове 1, 2, 4, 5 и получалось что [].join.call(log[i]) не работал. Я не мог понять зачем внутри call log[i], ведь на первой итерации log[i] = 1. И поэтому смысл выражения для меня терялся. Буду переделывать. И да, зачем одалживать метод, ведь log обычный массив? |
Илья Кантор,
почему ты не запилишь нормальный форум? только домен пропадает |
Часовой пояс GMT +3, время: 07:11. |