Перевірка синтаксису
Який результат цього коду?
let user = {
name: "Іван",
go: function() { alert(this.name) }
}
(user.go)()
П.С. Тут є пастка :)
Помилка!
Спробуйте:
let user = {
name: "Іван",
go: function() { alert(this.name) }
}
(user.go)() // помилка!
Повідомлення про помилку в більшості браузерів не дає нам велику кількість підказок про те, що пішло не так.
Помилка з’являється, оскільки крапка з комою відсутня після user = {...}
.
JavaScript не вставляє автоматично крапку з комою перед дужками (user.go)()
тому, що він читає код, як:
let user = { go:... }(user.go)()
Тоді ми також можемо побачити, що такий спільний вираз синтаксично є викликом об’єкта { go: ... }
як функція з аргументом (user.go)
. І це також відбувається на тій же лінії, з let user
, тому, оскільки об’єкт user
ще не визначений, виникає помилка.
Якщо ми вставляємо крапку з комою, все добре:
let user = {
name: "Іван",
go: function() { alert(this.name) }
};
(user.go)() // Іван
Зверніть увагу, що дужки навколо (user.go)
нічого не роблять тут. Зазвичай вони встановлюють порядок операцій, але тут крапка спрацьовує спочатку в будь-якому випадку, тому немає ефекту. Тільки грає роль лише крапка з комою вкінці.