Он состоит из двух основных частей 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!');
};