js変数バー(feat:昇格)
4929 ワード
へんすう
変数はプログラミングで最も基本的に使用される概念です.値の保存と再利用に使用します.
コンピューターの動作は人間の脳に似ている.人間の脳が情報を処理する方法でコンピュータの動作をモデリングしたのは、必然的に似ている.
簡単に言えば、10+20を計算するときは、まず10を読み、10という数字を覚えてから、プラス記号を読み、プラス記号演算をしてから、被演算子20を読み、覚えます.そして2つの数字を加算した演算を行い、結果30を記憶する.この過程で記憶という言葉が出てきた.すなわち,ある演算を行う場合,記憶すなわち記憶の概念は必然的に伴う.現在は単純な演算しか行われていませんが、これらのデータが後で使用されるスペースがあれば、長期メモリに移行する必要があります.
この場合は変数を使用します.
定義#テイギ#
変数の定義は、値を格納するために取得されたメモリ領域自体またはその空間を識別するために取得された名前です.すなわち、メモリ空間自体を変数と呼ぶこともでき、その空間を識別するために命名された名前を変数と呼ぶこともできる.
JavaScriptでは、開発者がメモリにアクセスできません.C言語のような非言語言語は、mallocコマンドやfreeコマンド、ポインタ変数を使用してメモリ領域に直接アクセスしたり、メモリを割り当てたり解放したりすることができます.しかし、JavaScriptは非規範言語であり、このような危険行為は許されない.
簡単に言えば、変数はプログラミング言語で値を格納および参照するためのメカニズムであり、値の位置の象徴的な概念を指す.
変数を使用するプロセス
変数は大体3つのプロセスを経て使用できます.
まずvar変数の使用手順を決定します.
var変数宣言
宣言とは、変数が実行コンテキストにメモリを登録して割り当てるプロセスです.実行コンテキストは、JavaScript内部エンジンによって管理されるグローバルランタイム環境マネージャと見なすことができます.変数は、実行コンテキストでkey:value形式の変数名とメモリアドレスとしてマッピングされ、格納されます.
var a;
対応するコードで変数を宣言します.var変数の初期化
varは通常、宣言と初期化を同時に発生します.宣言されると、未定義の割り当てがすぐに初期化されます.
var変数の割り当て
初期化後、値を割り当てることができ、割り当て後、値を呼び出すことで使用できます.割り当てがなくても呼び出しで使用できますが、undefinedが呼び出されます.
がんばって
コード作成はJavaScript特有の現象です.さらに,この現象はvar変数と結びつき,非常に特殊な結果を得た.JavaScriptエンジンは、実行時の前にすべての変数と関数の宣言をスキャンし、保存します.このメカニズムは,宣言コードを対応する走査線から一番上に引っ張ったように見える.だからこの現象はハウスティンと命名された.しかし、この現象は実際にはコードを上に上げず、宣言の概念を事前に読むことである.
var変数との関連
var変数は、宣言と初期化が同時に発生します.実行時の前にvar変数が実行時コンテキストに登録されます.これにより、次のコードはエラーではなく定義されていないものを出力します.
console.log(a);
var a = 10;
一般的な言語では、referenceerror、すなわち参照エラーが発生するのは当然です.宣言されていない、初期化されていない変数を呼び出す方法.しかしjavascriptのエスケープ現象やvar変数の特性により実現可能である.反発現象の発生に伴いvar変数は実行時までに実行コンテキストに登録される.すなわち,宣言は実行前に自動的に実行される.また,var変数は初期化が宣言と同時に発生したことを示す.すなわち,実行に入るとvar変数はundefinedと宣言されるため初期化される.したがって、上記のコード出力はエラーではなく、定義されていません.let,cont変数でのエスケープ
let、cont変数もエスケープされます.実際、javascriptのすべての宣言はエスケープになります.functionもclassも良くなります.ただし、letとconstはvarとは異なり、上記のコードのように記述されるとundefinedは出力されず、参照エラーが投げ出されます.
console.log(a);
let a = 10;
この違いは初期化の観点から生じた.let,cont変数の初期化点は実行時独自のコード位置である.すなわちvar変数は宣言と同時に初期化され,let,cont変数は宣言され(最初は反発として宣言された),自分の実際のコード位置に到達してこそ初期化が実行される.{ let a } // 호이스팅 된 것처럼 보이는 코드 - 이 시점에는 선언만 된다.
console.log(a)
let a; // 이 시점에 초기화가 일어난다.
コンソール.log(a)はエラーを投げ出し、初期化されていないゴミ値を格納する変数を参照しません.なぜお守りが出てくるのか
では、hoistingはjavascriptの副作用と言えるでしょう.一般的には、エラーを起こす必要がある場合にエラーを起こさないと副作用が発生します.では、なぜjavascript言語開発者はこのような予測しにくい状況を作成するのでしょうか.
これはJavaScriptを作成する場合に遡ります.筆者はjavascriptはまったくない言語だとよく言います.私の最も主要な言語ですが、認めるべきなのはやはり認めなければなりません.JAvascriptは開発者のために作成された言語ではありません.JavaScriptは、ブラウザのDOM処理を支援するために作成されたスクリプト言語であり、その目的自体はプログラミングではありません.そのため、この言語を学習し、使用する必要がある人は開発者ではなく、Webデザイナーやパブリッシャーです.そのため、学習が容易で、誤りを最小限に抑え、明確に動作する言語が必要です.何も知らずに開発した人なら、逆に賢い現象だ.どこで宣言を発表しても、呼び出して使用できます.
JAvascriptの創始者ブランデン・エクアジェ氏は、varエスケープ現象が関数エスケープを実現する副作用であることを明らかにした.さらに,es 6はこの問題を解決するためにlet変数を導入した.
すなわち,top−downのコード実行方式は関数の使用に有効ではないと考えられるため,var変数コードを生成する副作用で関数コードを作成しようとした.
ソース:
https://ui.toast.com/weekly-pick/ko_20200228
モダンjavascript deep dive
https://v8.dev/blog/trash-talk
Reference
この問題について(js変数バー(feat:昇格)), 我々は、より多くの情報をここで見つけました https://velog.io/@lky9303/js-변수란-feat-hoisting-가비지-컬렉션テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol