9

Прежде чем перейти сюда чтобы задать вопрос, я честно на протяжении часа гуглил, но не смог найти ответов, хоть и в некоторых ссылках встречалось похожее. Вопрос следующий - что в JS значит ноль в следующей конструкции:

var n = (0, window.unescape)("somestring");

Буду благодарен за ответ или ссылку где прочитать можно.

Pavel Mayorov
  • 58,537
justyx
  • 506

1 Answers1

13

в данном случае он ничего не значит и вместо него могло быть что угодно. Нужен он тут для срабатывания оператора запятая.

При таком применении оператора запятой можно получить ссылку на метод оторванный от текущего контекста и при вызове его будет использован глобальный контекст. В данном случае window.

То есть, запись в вопросе эквивалентна следующей

var unescape = window.unescape;
var n = unescape("something");

Учитывая, что в данном случае всегда функция будет вызываться в глобальном контексте нет смысла это делать и можно обойтись обычным вызовом

var n = window.unescape("somestring");

Пример когда это имеет смысл

var a = {
  func: function() {
    console.log('eval context is window: ', (0, eval)("this") === window);
    console.log('eval context is current object: ', eval("this") === a);
  },
  func1: function() {
    console.log('context: ', this.toString());
  }
}

a.func(); (1, a.func1)(); (a.func1)();

Grundy
  • 81,538
  • 1
    Почему запятая меняет контекст? Определённо капкан архитектуры JS. –  Aug 12 '16 at 10:03
  • Еще бы ссылку на подробное описание данного оператора добавить, а то я тоже узнал для себя что-то новое =) – qodunpob Aug 12 '16 at 10:03
  • 1
    @Other, контекст меняет не запятая, а именно ее такое применение. по сути это оператор который возвращает последний операнд, в данном случае это ссылка на метод, то есть мы взяли эту ссылку и вернули и дальше сразу вызвали ее. – Grundy Aug 12 '16 at 10:05
  • Я понял что возвращает, но почему это происходит? Понимаю если 0 || func, например, но тут что? –  Aug 12 '16 at 10:08
  • 1
    Ндаа, забавный оператор Оператор запятая – qodunpob Aug 12 '16 at 10:09
  • @Other, вот сейчас я не понял :-) я в ответе написал эквивалент: сохранение метода в переменную и затем выполнение, вот тут то же самое. если вопрос вообще: почему контекст меняется тут можно посмотреть вопрос: Потеря контекста вызова – Grundy Aug 12 '16 at 10:10
  • 4
    Почитал по ссылке уважаемого @КонстантинБашаркевич [Запятая позволяет перечислять выражения, разделяя их запятой ','. Каждое из них – вычисляется и отбрасывается, за исключением последнего, которое возвращается.] и понял что и почему, благодарю за Ваше пояснение по теме. –  Aug 12 '16 at 10:24
  • Огромное спасибо за развернутый ответ, многое встало на свои места, собственно данный код попал мне в руки в результате долгой и мучительной деобфускации. – justyx Aug 12 '16 at 11:37
  • @Other из подобного в голову сразу приходит метод prog_match_replace() из php, позволявший при использовании модификатор \e исполнять найденные на замену строки как код в контексте сервера. С версии 5.5 deprecated. – justyx Aug 12 '16 at 11:52
  • @justyx, особой связи не вижу, хотя флаг e меня насторожил в своё время. Как и всё из группы eval, впрочем. –  Aug 12 '16 at 12:18