Каков будет результат этого кода?
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