[解決済み】letやconstで宣言された変数はホイストされるのか?
質問
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
は吊り上げられないのですか?本当はどうなっているのでしょうか?とは何か違いがあるのでしょうか?
let
と
const
この件に関して?
どのように解決するのですか?
これらの変数は、@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関数宣言の中)。
<ブロッククオート
とは何か違いがあるのでしょうか?
let
と
const
この件に関して?
いいえ、巻き上げるという点では同じです。ただ、両者の違いは
const
は、宣言のイニシャライザーの部分で代入しなければならず、また代入することはできません (
const one = 1;
は、いずれも
const one;
のように、後で再割り当てされます。
one = 2
は無効です)。
<サブ
1:
var
の宣言が機能するのは、もちろん関数レベルだけです。
関連
-
[解決済み】Facebook Graph API のクエリで with=location を使用すると "Uncaught (in promise) undefined" というエラーが発生する。
-
[解決済み】node.js TypeError: path must be absolute or specify root to res.sendFile [JSONのパースに失敗しました]。
-
[解決済み】JavaScriptで':'(コロン)は何をするのか?
-
[解決済み】Javascriptのコールバック関数がFirefoxで「Callback is not a function」というエラーを投げる
-
[解決済み】Google Conversionsが動作しない - スクリプトが読み込まれない
-
[解決済み】Reactのeslintエラーはpropsの検証で見つからない
-
[解決済み】Redux TypeError: 未定義のプロパティ 'apply' を読み取れない
-
[解決済み】React-Routerの子が1つしかない。
-
[解決済み】Kendo Observable Bindingと併用する場合、Kendo Switch Labelsを変更することは可能ですか?[Kendo-UI]です。
-
[解決済み] 変数における const と constexpr の比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Uncaught ReferenceError: angular is not defined - AngularJSが動作しない。
-
[解決済み】Uncaught TypeError: nullのプロパティ'value'を読み取ることができない
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み】webpack-dev-serverにリモート接続すると、「Invalid Host header」というメッセージが表示されます。
-
[解決済み] テスト
-
[解決済み】Reactのeslintエラーはpropsの検証で見つからない
-
[解決済み】Javascript - ERR_CONTENT_LENGTH_MISMATCH
-
[解決済み】 Uncaught Error: Invariant Violation: 解決済み】 Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function but got: object.
-
[解決済み】未定義のプロパティ 'forEach' を読み取ることができない
-
[解決済み】JavaScriptで関数が存在するかどうかを確認する方法は?