ES 6の変化:Var、さようなら


書く理由:
現代javascript deep deep本を通じて、javascriptの概念学習も終わりに達した.実戦と同時に数回の指摘を繰り返しますが、ここではES 6とES 5を区別する主な違いを指摘したいと思います.なぜES 6がこんなに重要な転換点なのか、なぜこのような変化があるのか、それをどのように利用するかをまとめました.
ES 6に追加された最も重要な要素が変数宣言(let,const)の出現、矢印関数、およびイテレーションプロトコルである場合.もちろん,クラス,Map,Set,新たに追加された様々な構築手法なども他に重要な変化があり,更新が続いている.
ここで、変数宣言、矢印関数、およびイテレーションプロトコルを選択するのは、JavaScriptに基づいて使用範囲を拡張する転換点であるためです.言い換えれば、本来自分で処理できるJavaScriptエンジンは、賢い開発者を信頼し、コントロールロールを渡す部分と言える.

var、さようなら


varはES 5までユニークな変数宣言キーワードです.これまで変数を宣言するにはvarしか使用できませんでした.何か問題がありますか?

質問1:繰り返し宣言、黙示宣言を許可


実はvarを使わなくても仕事ができることが多い.友好的なjavascriptエンジンは、開発者が自分で識別子を登録したため、忘れたと考えています.

// 암묵적 선언
// 함수 내부에 선언되지 않은 변수 a에 10을 할당했다.
function foo(){
    a = 10;
}
// 함수 호출
foo();

// 전역에서 a를 불렀는데 10이라는 값이 나온다.
console.log(a); // 10

function foo2(){
  console.log(a);
}
foo2(); // 10
上記の場合、関数fooが呼び出されると、関数foo集合環境の環境レコードにaという識別子が検索される.見つからないので、スキャンチェーンに沿って外部参照スキャンのグローバルスキャンで見つけました.ここにない場合は、グローバルオブジェクトとしてPropertyを作成し、値を割り当てます.
同じ名前で宣言しても間違いないので、見ていないふりをします.次の例
// 중복 선언
var b = 10; // 변수 b를 선언하고 10을 할당
var b; // 같은 이름으로 변수 b 선언 -> 무시
console.log(b); // 10

var b = 'hi'; // 같은이름의 변수를 선언하고 값 할당
console.log(b); // 'hi' 선언

問題2。かんすうレベルそうさ


スコフについての質問もあります.関数レベルスキャンを持つvarが関数以外のブロックに宣言された場合、グローバルに宣言されたvarと同様に登録されます.
var i = 'I am i';

for (var i = 0; i<3; i++){
  console.log(i);
} // 0 1 2

console.log(i); // 3
varは関数レベルのスキャン(管理識別子を作成する環境レコードの基準は関数)であるため、for文では個別のスキャンは行われません.したがって、variはグローバルオブジェクトを繰り返し宣言したiに等しく、javascriptエンジンが見ていないふりをするため、iに値を再割り当てすることに相当します.したがって,反復文は0,1,2,3に転換し,瞬間条件に合致せず,反復文は終了する.
だから最後はconsoleロゴ(i)を撮ると3が出てきます.
など、グローバル変数として登録するのはなぜ問題になるのでしょうか.
上記の例に示すように、グローバル変数は、いつでもどこでも参照できる変数、すなわち暗黙的な結合を可能にする変数である.そのため、想定外の変数値変更が発生する可能性があり危険です.
パフォーマンスの面ではプログラムのライフサイクルと同じであるため、一時的に必要な変数であれば、グローバル登録時に不要なメモリが浪費されます.それ以外に,スキャンチェーンの終点にあるため,識別者の探索速度が最も遅いという問題,ネーミング空間汚染を引き起こす問題などがある.

に質問へんすうかそく


実行時にvarと宣言された変数のようにコードの上部に引っ張られる現象を変数エスケープと呼ぶ.JAvascriptエンジンは、varとして宣言された変数、関数宣言を評価し、scopeに登録するため、コードを実行する前に評価フェーズがあります.undefined値が保存されるので、変数を宣言する前に変数を呼び出すとundefined値が読み込まれます.

console.log(c); // undefined

var c = 10;

console.log(c); // 10
Javascriptエンジンの実行手順を理解すると、コードの作成が容易に理解できます.
varは、コード実行前にundefined値を初期化する.したがって、実行時に発生した変数が宣言された場所よりも早い場合はundefinedが返されます.let,constはコード実行前に宣言した後に初期化しない.したがって,コード実行中にエスケープは発生しないようである.

varの問題まとめ

  • デフォルト識別子登録
  • 関数レベルスキャン
  • は、
  • を再宣言することができる
  • 変数護衛
  • 変数はlet、constとして宣言されます


    varがかつて存在していた問題を解決します.
  • 未登録パスワード識別子
  • ブロックレベルスキャン
  • 再宣言不可
  • 動作
  • 変数、定数の用途区分(contがオブジェクトの場合は参照値を変更しないだけ).
  • n/a.結論


    varにおける無名の処理は,かえって細かく開発するための問題となっている.JAvascriptは、ブラウザで簡単な操作を処理する言語ではなく、複雑なフレームワークとバックエンドを使用して、開発者により多くの権限と責任を提供します.
    ECMA 6では、これらの明らかな変化は矢印関数、イテレーションプロトコルにも見られる.次の記事では、矢印関数とイテレーションプロトコルについて説明し、開発者がES 6で果たす役割について説明します.