Є дві основні частини, які var FOO = FOO || {};
охоплює.
№1 Запобігання перекриттям
Уявіть, що ваш код розділений на кілька файлів, а ваші колеги також працюють над об'єктом, який називається FOO
. Тоді це може призвести до того, що хтось уже визначив FOO
і призначив йому функціональність (як skateboard
функція). Тоді ви перекривали б це, якби не перевіряли, чи він уже існує.
Проблемний випадок:
// Definition of co-worker "Bart" in "bart.js"
var FOO = {};
FOO.skateboard = function() {
alert('I like skateboarding!');
};
// Definition of co-worker "Homer" in "homer.js"
var FOO = {};
FOO.donut = function() {
alert('I like donuts!');
};
У цьому випадку skateboard
функція пропаде , якщо ви завантажуєте файл JavaScript homer.js
після bart.js
в вашому HTML , тому що Гомер визначає новий FOO
об'єкт (і , таким чином , скасовує існуючу від Барта) , тому він знає тільки про donut
функції.
Тож вам потрібно використовувати, var FOO = FOO || {};
що означає "FOO буде призначено FOO (якщо він вже існує) або новий порожній об'єкт (якщо FOO вже не існує).
Рішення:
var FOO = FOO || {};
// Definition of co-worker Bart in bart.js
FOO.skateboard = function() {
alert('I like skateboarding!');
};
// Definition of co-worker Homer in homer.js
var FOO = FOO || {};
FOO.donut = function() {
alert('I like donuts!');
};
Тому що Барт і Гомер тепер перевірка на існування , FOO
перш ніж вони визначають свої методи, ви можете завантажити bart.js
і homer.js
в будь-якому порядку без перевизначення методів один одного (якщо вони мають різні назви). Таким чином, ви завжди отримаєте FOO
об'єкт, який має методи skateboard
та donut
(Так!).
№2 Визначення нового об’єкта
Якщо ви прочитали перший приклад, то вже тепер, яка мета цього || {}
.
Тому що, якщо існуючого FOO
об'єкта немає, то ІЛИ-корпус активується та створює новий об’єкт, тож ви можете призначити йому функції. Подібно до:
var FOO = {};
FOO.skateboard = function() {
alert('I like skateboarding!');
};