назад до уроку

Перевірка синтаксису

важливість: 2

Який результат цього коду?

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) нічого не роблять тут. Зазвичай вони встановлюють порядок операцій, але тут крапка спрацьовує спочатку в будь-якому випадку, тому немає ефекту. Тільки грає роль лише крапка з комою вкінці.