[解決済み] let "と "var "の使い分けは?
質問
ECMAScript 6導入
その
let
ステートメント
.
と表現されるそうですね。
local
変数とどう違うのか、まだよく分かっていません。
var
というキーワードがあります。
どのような違いがあるのでしょうか。どのような場合に
let
の代わりに
var
?
解決方法は?
スコープルール
主な違いは、スコーピングルールです。で宣言された変数は
var
キーワードは直前の関数本体にスコープされる(そのため関数スコープとなる)のに対し
let
変数は、その直前の
囲む
で示されるブロック
{ }
(となります(したがってブロックスコープ)。
function run() {
var foo = "Foo";
let bar = "Bar";
console.log(foo, bar); // Foo Bar
{
var moo = "Mooo"
let baz = "Bazz";
console.log(moo, baz); // Mooo Bazz
}
console.log(moo); // Mooo
console.log(baz); // ReferenceError
}
run();
その理由
let
キーワードが導入されたのは、関数スコープが混乱し、JavaScriptのバグの主な原因の1つになっていたからです。
この例を見てください。 Stack Overflowの別の質問 :
var funcs = [];
// let's create 3 functions
for (var i = 0; i < 3; i++) {
// and store them in funcs
funcs[i] = function() {
// each should log its value.
console.log("My value: " + i);
};
}
for (var j = 0; j < 3; j++) {
// and now let's run each one to see
funcs[j]();
}
My value: 3
がコンソールに出力されるたびに
funcs[j]();
は、無名関数が同じ変数に束縛されていたため、呼び出されました。
ループから正しい値を取得するために、すぐに呼び出せる関数を作る必要がありましたが、これも毛嫌いされていました。
ホイスト
で宣言された変数が
var
キーワードは
吊り下げ
(で初期化される)。
undefined
これは、宣言される前でも、そのスコープでアクセス可能であることを意味します。
function run() {
console.log(foo); // undefined
var foo = "Foo";
console.log(foo); // Foo
}
run();
let
変数は、その定義が評価されるまで初期化されません。初期化される前にアクセスすると
ReferenceError
. この変数は、ブロックの開始から初期化処理が行われるまで、"Temporal Dead Zone"にあると言われています。
function checkHoisting() {
console.log(foo); // ReferenceError
let foo = "Foo";
console.log(foo); // Foo
}
checkHoisting();
グローバルオブジェクトプロパティの作成
トップレベルでは
let
とは異なり
var
は、グローバルオブジェクトにプロパティを作成しません。
var foo = "Foo"; // globally scoped
let bar = "Bar"; // not allowed to be globally scoped
console.log(window.foo); // Foo
console.log(window.bar); // undefined
再宣言
ストリクトモードの場合
var
は同じ変数を同じスコープで再宣言できるのに対し
let
はSyntaxErrorを発生させます。
'use strict';
var foo = "foo1";
var foo = "foo2"; // No problem, 'foo1' is replaced with 'foo2'.
let bar = "bar1";
let bar = "bar2"; // SyntaxError: Identifier 'bar' has already been declared
関連
-
[解決済み】Uncaught SyntaxError: JSONの位置0に予期しないトークンuがあります。
-
[解決済み】event.stopPropagationとevent.preventDefaultの違いは何ですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] HTML5のlocalStorageにオブジェクトを格納する方法は?
-
[解決済み] Bowerとnpmの違いは何ですか?
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] JavaScriptのnullとundefinedの違いは何ですか?
-
[解決済み] nullはなぜオブジェクトなのか、nullとundefinedの違いは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
vue3レスポンシブ対応のためのsetup+ref+reactive
-
要素ツリー制御によるvueTreeテーブル
-
Vue+ElementUIによる大規模なフォームの処理例
-
vue+webrtc(Tencent cloud)ライブ機能の実践を実現するために
-
VUEグローバルフィルターの概念と留意点、基本的な使い方
-
Vueのイベント処理とイベントモディファイアの解説
-
[解決済み】JavaScriptの配列でforEachが関数でない不具合
-
[解決済み】TypeError: Router.use() はミドルウェアの関数を要求しているが、Object を取得した。
-
[解決済み】gulp anythingを実行するたびに、アサーションエラーが発生します。- タスク関数を指定する必要があります
-
[解決済み】React-Redux: アクションはプレーンオブジェクトでなければならない。非同期アクションにはカスタムミドルウェアを使用する