From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- files/ja/glossary/hoisting/index.html | 84 +++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 files/ja/glossary/hoisting/index.html (limited to 'files/ja/glossary/hoisting/index.html') diff --git a/files/ja/glossary/hoisting/index.html b/files/ja/glossary/hoisting/index.html new file mode 100644 index 0000000000..419b2bde23 --- /dev/null +++ b/files/ja/glossary/hoisting/index.html @@ -0,0 +1,84 @@ +--- +title: Hoisting (巻き上げ、ホイスティング) +slug: Glossary/Hoisting +tags: + - CodingScripting + - Glossary + - JavaScript + - 用語集 +translation_of: Glossary/Hoisting +--- +

巻き上げ (Hoisting) は、ECMAScript® 2015 言語仕様より前には、どんな規範的な仕様書にもなかったものです。巻き上げは JavaScript の実行コンテキスト (特に作成と実行のフェーズで) では一般的な方法と考えられていました。しかし、巻き上げの概念は誤解に繋がる可能性があります。

+ +

概念的には、例えば、厳密な定義では、変数や関数の宣言が物理的にコードの先頭に移動されることを示唆していますが、実際にはそうではありません。変数や関数の宣言はコンパイル時にメモリに格納されますが、コード内で入力された場所は変わりません。

+ +

詳細情報

+ +

技術的な例

+ +

JavaScript で関数宣言がコード領域を実行する前にメモリーに配置される利点は、コードで関数を定義する前に使うことができることです。例えば:

+ +
function catName(name) {
+  console.log("My cat's name is " + name);
+}
+
+catName("Tiger");
+
+/*
+上記のコードの結果: "My cat's name is Tiger"
+*/
+
+ +

上記のコード断片はコードが動作するように書いたよう期待する方法です。今度は、関数を書く前に関数を呼び出したらどうでしょう。

+ +
catName("Chloe");
+
+function catName(name) {
+  console.log("My cat's name is " + name);
+}
+/*
+上記のコードの結果は: "My cat's name is Chloe"
+*/
+
+ +

コード内で関数を書く前に、関数呼び出しを最初に書いても、コードは動作します。これは JavaScript でコンテキスト実行が動作するためです。

+ +

巻き上げはその他のデータ型や変数でも同様に動作します。変数は定義の前に初期化して使うことができます。しかし初期化しないと使うことができません。

+ +

定義のみが巻き上げられる

+ +

JavaScript では定義のみが巻き上げられ、初期化はそうでありません。変数が使用された後に定義や初期化された場合、値は undefined になります。例えば次のようになります。

+ +
console.log(num); // undefined を返す。宣言のみが巻き上げられ、この段階では初期化が行われないため
+var num; // 宣言
+num = 6; // 初期化
+ +

以下の例では初期化のみが行われています。巻き上げが行われませんので、変数を読み取ろうとすると ReferenceError 例外が発生します。

+ +
console.log(num); // ReferenceError 例外が発生
+num = 6; // 初期化
+ +

巻き上げの例をもっと示します。

+ +
// 例 1
+// y のみが巻き上げられる
+
+x = 1; // x を初期化し、まだ定義されていない場合は、定義する - ただし、文中に var がないので巻き上げは行われない。
+console.log(x + " " + y); // '1 undefined'
+// JavaScript は宣言のみを巻き上げるので、 y の値の表示はこうなる。
+var y = 2; // y の宣言と初期化
+
+
+// 例 2
+// 巻き上げは行われないが、初期化は (まだ宣言されていない場合は) 宣言も行うので、変数は利用できる。
+
+a = 'Cran'; // Initialize a
+b = 'berry'; // Initialize b
+console.log(a + "" + b); // 'Cranberry'
+ +

技術リファレンス

+ + -- cgit v1.2.3-54-g00ecf