Переменная подъема
Одним из самых простых видов использования подъема является переменный подъем.Если бы у нас не было подъема переменных, это выкинуло бы ReferenceError
:
var bar = foo;
var foo;
Это не кажется полезным сразу, но позволяет нам делать такие вещи:
var myCoolJS = myCoolJS || {};
Это в основном означает, как это выглядит: myCoolJS
- это myCoolJS
, если он существует, или новый объект, если он не существует.Второй myCoolJS
не выбрасывает ReferenceError
, если myCoolJS
еще не существует, потому что это объявление переменной поднято.
Это избавляет нас от неловкой проверки typeof myCoolJS != 'undefined'
.
Подъем функций
Подъем функций может быть особенно полезен, когда объединяет несколько скриптов в один ,Например, я создал легкую реализацию во время сборки модулей CommonJS .Это обеспечивает те же функции module
, require
и exports
, которые находятся в файле node.js.Я построил инструмент, позволяющий составлять необходимые модули из нескольких файлов.Например, require('/foo')
может привести к созданию модуля, состоящего из двух файлов, foo.js
("файл тела") и foo.h.js
("файл заголовка").
Это разрешит "файл тела"«не иметь представления о свободных переменных, предоставляемых средой модулей CommonJS;все это обрабатывается в заголовке.Это делает код многоразовым и легко тестируемым без сборки.Однако, поскольку заголовки добавляются к телу, мы используем функцию , поднимающую в файле тела, чтобы разрешить экспорт в заголовки.Например:
// dom.h.js
var util = require('util').util;
exports.css = css; // we can do this because "css" is hoisted from below
// ... other exports ...
...
// dom.js
function css(){}; // this would normally just be an object.
css.hasClass = function(element) { ... };
css.addClass = function(element) { ... };
// ...other code...