По мотивам диалога в телеграмме:
@artur_viktorovich:
А как вы в TS пишете выражения вида (0, this.function)()?
На вопрос зачем такое писать, было сказано следующее:
более быстрый (где-то я такое слышал) аналог this.function.call(void 0)
Для начала, от того, указываем "use strict" или нет будет зависеть то, как это всё будет работать. Внутри коллбека будет либо window либо undefined (если мы туда конечно что-то другое не передадим). Код можно посмотреть в CallbackPerfTests.ts, запустить у вас его не получится, ибо я это делал в своём тестовом фреймворке, переписать это на чистый js без завязки на пандовский тестэнджин предлагается читателю для самостоятельнйо работы.
Вот какие способы написать желаемое я использовал
test_callSeparateMulti
let exCb = this.callback;
exCb();
test_callCallVoid0Multi
this.callback.call(void 0);
test_callApplyVoid0Milti
this.callback.apply(void 0);
test_callWith0Multi
(0, this.callback)();
test_callCallUndefinedMulti
this.callback.call(undefined);
test_callApplyUndefinedMulti
this.callback.apply(undefined);
test_callCallNullMulti
this.callback.call(null);
test_callApplyNUllMulti
this.callback.apply(null);
test name | ms |
---|---|
test_callSeparateMulti | 1198 |
test_callCallVoid0Multi | 1200 |
test_callApplyVoid0Milti | 1193 |
test_callWith0Multi | 1201 |
test_callCallUndefinedMulti | 1191 |
test_callApplyUndefinedMulti | 1200 |
test_callCallNullMulti | 1193 |
test_callApplyNUllMulti | 1199 |
test name | ms |
---|---|
test_callSeparateMulti | 8 |
test_callCallVoid0Multi | 8 |
test_callApplyVoid0Milti | 2675 |
test_callWith0Multi | 7 |
test_callCallUndefinedMulti | 8 |
test_callApplyUndefinedMulti | 2663 |
test_callCallNullMulti | 9 |
test_callApplyNUllMulti | 2664 |
test name | ms |
---|---|
test_callSeparateMulti | 55 |
test_callCallVoid0Multi | 82 |
test_callApplyVoid0Milti | 306 |
test_callWith0Multi | 67 |
test_callCallUndefinedMulti | 81 |
test_callApplyUndefinedMulti | 306 |
test_callCallNullMulti | 87 |
test_callApplyNUllMulti | 302 |
test name | ms |
---|---|
test_callSeparateMulti | 13 |
test_callCallVoid0Multi | 13 |
test_callApplyVoid0Milti | 406 |
test_callWith0Multi | 7 |
test_callCallUndefinedMulti | 15 |
test_callApplyUndefinedMulti | 424 |
test_callCallNullMulti | 14 |
test_callApplyNUllMulti | 401 |
test_callWith0Multi, а именно (0, this.callback)(); оказался незначительно быстрее только в Edge. В поведении не отличается от классических способов избавиться от контекста, таким образом никакого смысла данная конструкция не имеет и к применению противопоказана.
Также видно что apply без аргумента работает медленней чем call везде, кроме chrome, причём местами достаточно сильно медленнее.
Вместо распространения странных слухов о скорости разных синтаксических конструкций пишите тесты на производительность, это не так сложно, но даёт достоверный результат, но делайте это правильно.
https://www.youtube.com/watch?v=HPFARivHJRY
https://www.youtube.com/watch?v=tS6XHqRhpEQ&feature=youtu.be&t=1h56m34s Слайды к докладу https://docs.google.com/presentation/d/1Nii3bxeSvLtFeLtpXi_G9Ue_LVl28_WjGKJs4O1QoOA/edit