Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос по задачке (https://javascript.ru/forum/misc/36649-vopros-po-zadachke.html)

xfreewindx 23.03.2013 11:43

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

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

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 в скобках всего один аргумент.

Спасибо.

Илья Кантор 23.03.2013 12:02

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

Внутренний алгоритм join заключается в том, что this[0]...this[length-1] объединяются через запятую (или другой разделитель, если указан).

Ervin 23.03.2013 12:11

[].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

danik.js 23.03.2013 13:08

Вместо [].join по идее должно быть Array.prototype.join - именно тут этот метод определен.
А почему не просто log[i].join() ?

xfreewindx 23.03.2013 14:20

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

У меня просто было решение, в котором log сначала при первом вызове work содержал 1 и 2, при втором вызове 1, 2, 4, 5
и получалось что [].join.call(log[i]) не работал. Я не мог понять
зачем внутри call log[i], ведь на первой итерации log[i] = 1. И поэтому смысл выражения для меня терялся. Буду переделывать.
И да, зачем одалживать метод, ведь log обычный массив?

megaupload 23.03.2013 14:22

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


Часовой пояс GMT +3, время: 07:11.