1. ホーム
  2. ジャバスクリプト

[解決済み】letやconstで宣言された変数はホイストされるのか?

2022-04-19 13:43:55

質問

ES6をしばらく使っていて気づいたのですが、ES6で宣言された変数に var は期待通りにホイストされるのですが...。

console.log(typeof name); // undefined
var name = "John";

で宣言された変数。 let または const は、ホイストに問題があるようです。

console.log(typeof name); // ReferenceError
let name = "John";

そして

console.log(typeof name); // ReferenceError
const name = "John";

で宣言された変数は let または const は吊り上げられないのですか?本当はどうなっているのでしょうか?とは何か違いがあるのでしょうか? letconst この件に関して?

どのように解決するのですか?

これらの変数は、@thefourtheye の言うとおりです。 にアクセスすることはできません。 宣言される前に しかし、もう少し複雑です。

で宣言された変数は let または const を巻き上げないのか?本当はどうなっているのでしょうか?

すべての宣言 ( var , let , const , function , function* , class ) は、"hoisted"です。 をJavaScriptで作成しました。これは、あるスコープで名前が宣言されると、そのスコープでは常にその識別子がその特定の変数を参照することを意味します。

x = "global";
// function scope:
(function() {
    x; // not "global"

    var/let/… x;
}());
// block scope (not for `var`s):
{
    x; // not "global"

    let/const/… x;
}

これは、ファンクションスコープとブロックスコープの両方に当てはまります。 1 .

との差は var / function / function* の宣言と let / const / class 宣言は 初期化 .

前者は、初期化されるのは undefined または(ジェネレータ)関数で、バインディングがスコープの先頭で作成されたときに、すぐに実行されます。しかし、辞書的に宣言された変数は 未初期化 . つまり ReferenceError にアクセスしようとすると、例外がスローされます。初期化されるのは let / const / class ステートメントが評価されると、その前(上)はすべて 時間的不感地帯 .

x = y = "global";
(function() {
    x; // undefined
    y; // Reference error: y is not defined

    var x = "local";
    let y = "local";
}());

があることに注意してください。 let y; ステートメントで変数を初期化し undefined のように let y = undefined; があるはずです。

は、その 時間的 デッドゾーンは、構文上の位置ではなく 時間 変数(スコープ)作成から初期化までの間。宣言より上のコードで変数を参照しても、そのコードが実行されない限りエラーにはなりません(例:関数本体や単なるデッドコード)。また、アクセスするコードが宣言より下にある場合でも、初期化前に変数にアクセスすると例外が発生します(例:早すぎる呼び出しのhisted関数宣言の中)。

<ブロッククオート

とは何か違いがあるのでしょうか? letconst この件に関して?

いいえ、巻き上げるという点では同じです。ただ、両者の違いは const は、宣言のイニシャライザーの部分で代入しなければならず、また代入することはできません ( const one = 1; は、いずれも const one; のように、後で再割り当てされます。 one = 2 は無効です)。

<サブ 1: var の宣言が機能するのは、もちろん関数レベルだけです。