Мастер-классы по Javascript Екатеринбург Ростов-на-Дону Москва Узнать больше...
Содержание (скрыть) Содержание (показать)

Проверка синтаксиса

Каков будет результат этого кода?

obj = {
  go: function() { alert(this) }
}

(obj.go || 0)()

P.S. Решение неожиданное, в задаче - «подводный камень»

Решение, шаг 1
Решение
Решение, шаг 1

Ошибка! Попробуйте:

obj = {
  go: function() { alert(this) }
}

(obj.go || 0)()  // error!

Причем сообщение об ошибке - очень странное. В большинстве браузеров это obj is undefined.

Дело, как ни странно, ни в самом объявлении obj, а в том, что после него пропущена точка с запятой.

JavaScript игнорирует перевод строки перед скобкой (obj.go || ..) и читает этот код как:

obj = { go:... }(obj.go || 0)()

Интерпретатор пытается вызывать объект { go: ... } как функцию, что и дает ошибку.

А что будет, если добавить точку с запятой?

obj = {
  go: function() { alert(this); }
}*!*;*/!*

(obj.go || 0)();

Решение, шаг 2
Решение, шаг 2

Результат — window, поскольку вызов obj.go || 0 аналогичен коду:

obj = {
  go: function() { alert(this); }
};

var f = obj.go || 0; // эти две строки - аналог (obj.go || 0)();
f();  // window

#272
Наверх

Реклама

Нашли опечатку?

Нашли опечатку на сайте? Что-то кажется странным?
Выделите соответствующий текст и нажмите Ctrl+Enter!

Последние Комментарии

Помоги другим!

Помоги другим узнать о хорошей статье!