Он состоит из двух основных частей 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объекта, тогда OR-case станет активным и создаст новый объект, поэтому вы можете назначить ему функции. Подобно:
var FOO = {};
FOO.skateboard = function() {
alert('I like skateboarding!');
};