JavaScriptコンテキストの条件の決定

2353 ワード

推奨サイト)
コメントサイトpoiema web
https://velog.io/@grinding_hannah/JavaScript-%ED%99%94%EC%82%B4%ED%91%9C%ED%95%A8%EC%88%98arrow-function-%EC%95%8C%EA%B8%B0 thisの概念を整理し、問題を解くには、いくつかの混同点がある.
なぜなら、私はscopeの概念を把握していないからです.scopeのコンセプトとjavascriptに関わる上位機のコンセプトを整理したいと思います.
スキャン(Scope、範囲)とは?
スコットランド識別子の有効範囲(変数にアクセスできる範囲).自分がどこにいるかによって、どのように発表されるかによってスキャンを決定します.
Javascriptでは、次の2つに分類できます.
  • グローバルスキャン
  • 地域スキャンローカル範囲
  • グローバルスコープ(Global scope):コード内の任意の場所で参照できます.
    領域範囲(Local scopeまたはFunction-level scope):関数コードブロックで作成されたscope関数自体とサブ関数でのみ参照できます.
    すべての変数にスキャンがあります.変数の観点からスケールを区別するには、次の2つに分類します.
  • グローバル変数(Global variable):グローバル宣言変数.任意の場所で参照できます.
  • 地域変数(Local variable):地域(関数)内で宣言された変数は、その地域およびその下部地域でのみ参照できます.
  • 変数は、宣言された場所(グローバルまたはゾーン)に基づいてスキャンされます.
    つまり、「グローバル宣言変数」は「グローバルスキャンを持つグローバル変数」であり、「領域(JavaScriptでは関数内部)で宣言される変数」は「領域スキャンを持つ領域変数」である.
    グローバルスキャンを持つグローバル変数は、グローバル(コード内の任意の場所)で参照できます.
    グローバル変数は、グローバルオブジェクトウィンドウのpropertyです.
    領域(関数の内部)で宣言された領域変数は、その領域とその下部領域でのみ参照できます.
    JavaScriptは関数レベルスキャン(function-level scope)に従います.함수 레벨 스코프とは、関数コードブロック内で宣言された変数が関数コードブロック内でのみ有効であり、関数外部では無効である(参照できない)ことを意味する.
    しかし、ECMAScript 6に導入されたletキーワードを用いてブロックレベルスキャンを用いることができる.
    前述したようにjavascriptは関数レベルスキャンなのでブロックレベルスキャンは使用しません
    したがって、関数外で宣言された変数がコードブロック内で宣言されても、「グローバルスキャン」があります.
    if (true) {
    var x = 5;
    }
    console.log(x);
    変数xはコードブロック内で宣言されますがjavascriptは関数レベルのscopeなのでxはグローバル変数です
    スコフチェーンとは?
    JAvascriptエンジンは、識別子を検索するときに、まずその属するscopeで検索し、そのscopeに識別子がない場合は親scopeで再検索します.この現象を「スキャンチェーン」と呼び、すべてが重なる場合に発生します.
    まず,関数位相を決定する基準は2つある.
  • 動的走査
  • 電子顕微鏡
  • 動的スキャンは、親スキャンがどこから呼び出されたかに基づいて決定されます.
    Lexicalscopeは,関数がどこで「宣言」されるかによって位相を決定する.
    🔷 JavaScriptはLexical Scopeに従うため、関数の宣言時に親Scopeを決定します.
    関数をどこから呼び出すかは、スキャン決定に何の意味もありません.
    私がこの問題を解くときに混同したのはこの点だ.
    JAvascriptの上位機の標準はLexical Scopeなので、問題に近づくために呼び出された時点ではなく、「関数がどこで宣言されているか」に重点を置くべきです.