可変巻き上げ
巻き上げの最も単純な用途の 1 つは可変巻き上げです。変数の巻き上げがない場合、これは次をスローしReferenceError
ます。
var bar = foo;
var foo;
これはすぐには役に立たないように思えますが、次のようなことができます。
var myCoolJS = myCoolJS || {};
これは基本的に、それがどのように見えるかを意味します:存在する場合myCoolJS
はmyCoolJS
それであり、存在しない場合は新しいオブジェクトです。2 番目は、この変数宣言が巻き上げられているため、まだ存在しない場合はmyCoolJS
スローしません。ReferenceError
myCoolJS
これにより、厄介なtypeof myCoolJS != 'undefined'
チェックを行う必要がなくなります。
機能の巻き上げ
関数ホイストは、複数のスクリプトを 1 つに結合する場合に特に役立ちます。たとえば、CommonJS モジュールの軽量なビルド時の実装を作成しました。これは、node.js にあるのと同じ、、、および機能を提供module
しrequire
ますexports
。必要なモジュールを複数のファイルで構成できるようにツールを作成しました。たとえば、 (「本体ファイル」) と(「ヘッダー ファイル」)require('/foo')
の 2 つのファイルで構成されるモジュールが生成される可能性があります。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...