巻き上げは JavaScript の動作概念です。巻き上げ(移動など)は、変数を宣言する方法と場所を説明する概念です。
JavaScript では、関数の宣言と変数の宣言は常に、JavaScript インタープリターによってそれらを含むスコープの先頭に見えないように移動 (「ホイスト」) されるため、使用後に変数を宣言できます。
ほとんどの場合、2 種類の巻き上げに遭遇します。
1.変数宣言の巻き上げ
このコードでこれを理解しましょう。
a = 5; // Assign 5 to a
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = a; // Display a in the element
var a; // Declare a
//output-> 5
ここで、変数 a の宣言は、コンパイル時に JavaScript インタープリターによって目に見えないようにトップにホストされます。これで a の値を取得できました。しかし、変数を宣言するこのアプローチはお勧めできません。なぜなら、このようにすでにトップに変数を宣言しなければならないからです。
var a = 5; // Assign and declare 5 to a
elem = document.getElementById("demo"); // Find an element
elem.innerHTML = a; // Display a in the element
// output -> 5
別の例を考えてみましょう。
function foo() {
console.log(x)
var x = 1;
}
実際には次のように解釈されます。
function foo() {
var x;
console.log(x)
x = 1;
}
この場合、x は未定義になります
変数の宣言を含むコードが実行されたかどうかは問題ではありません。この例を考えてみましょう。
function foo() {
if (false) {
var a = 1;
}
return;
var b = 1;
}
この関数は次のようになります。
function foo() {
var a, b;
if (false) {
a = 1;
}
return;
b = 1;
}
変数宣言では、割り当てではなく、変数定義のみが巻き上げられます。
- 関数宣言の巻き上げ
変数の巻き上げとは異なり、関数本体または割り当てられた値も巻き上げられます。このコードを検討してください
function demo() {
foo(); // this will give error because it is variable hoisting
bar(); // "this will run!" as it is function hoisting
var foo = function () {
alert("this would not run!!");
}
function bar() {
alert("this will run!!");
}
}
demo();
変数と関数の巻き上げの両方を理解したので、このコードを理解しましょう。
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
alert(a);
このコードは次のようになります。
var a = 1; //defines "a" in global scope
function b() {
var a = function () {}; //defines "a" in local scope
a = 10; //overwrites local variable "a"
return;
}
b();
alert(a);
関数 a() は、b() 内にローカル スコープを持ちます。a() は、その定義でコードを解釈している間 (関数ホイストの場合のみ) 先頭に移動されるため、 a はローカル スコープを持つようになり、したがって a のグローバル スコープには影響しませんが、関数 b() 内に独自のスコープがあります。 .