sprinters#1 var、let、const、Hoisting
就職するまで走る! 4月18日(月) var、let、const差異説明 イベントbundlingおよびキャプチャ について説明する Promiseを用いた非同期通信とasync,awaitを用いた非同期通信の違いを説明した. 号転送説明 仮想DOM記述 クラスと関数型要素の違い: 私の答え
https://www.howdy-mj.me/javascript/var-let-const/
var=再宣言、再割り当て可能
let=xを再宣言し、再割り当て可能
const=xを再宣言し、xを再割り当て
このため、変数の宣言と割り当てプロセス、エスケープ、スキャンについて理解する必要があります.
≪変数|Variable|oraolap≫:値を格納するために使用されるメモリ領域自体またはそのメモリ領域の名前を識別します.
変数のコンポーネント:変数名、値、およびメモリアドレス
変数は、値ではなくメモリアドレスを記憶します.変数名を使用すると、JavaScriptエンジンは、変数名とマッピングされたメモリアドレスを介して格納された値を返します.
割り当て:変数に値を保存
参照:変数に格納されている値の取得
宣言:変数名をJavaScriptエンジンに通知する
分配と宣言の違いを覚えてください!
JavaScriptでは,変数宣言は宣言→初期化の段階を経る.宣言フェーズ:変数名を登録し、JavaScriptエンジン変数の存在を通知します. 初期化フェーズ:メモリ値にメモリ領域を保持し、デフォルトでは定義されていない値を割り当てて初期化します. varを使用して宣言すると、宣言フェーズと初期化フェーズが同時に行われ、デフォルトでは変数名にundefinedが初期化されます.
ただし、実行時にコンソールに切り替えると、変数を宣言する前に未定義のエラーが表示されます.
これは,コード作成がJavaScript構文の特性であるためである.
JavaScriptエンジンは、ソースコードが行単位で実行される前(=実行時以前)に、すべての宣言(ex.変数宣言、関数宣言など)を検索してドラッグ&ドロップし、最初にこれらの宣言を実行します.すなわち、変数宣言がどこにあるかにかかわらず、他のコードの前に実行されることが保証される.
ここで発生する問題は、宣言と割り当てが同時に行われないことです.
変数宣言と割当ては、割当て演算子(=)によって1つの文(statement)に簡略化できますが、2つの実行ポイントが異なる場合があります.
変数宣言は実行時より前に実行されますが、値の割り当てはソースコードの順序で実行される実行時に実行されます.
したがって、返される値はコンソールの実行位置に依存します.
狙いを定める
1.変数宣言(var、let、const)
2.関数宣言(関数a(){})
護衛の目標じゃない
1.関数式(consta=function(){})
2.矢印関数(consta=()=>{})
関数宣言は、宣言の前後の任意の場所で呼び出すことができますが、両方の宣言は変数エスケープとみなされるため、宣言+初期化が終了したコードでのみ呼び出されます.
関数宣言文の場合は、実行時の前にJavaScriptエンジンで実行され、関数コードです.ただし、関数式と矢印関数の場合は、実行時の前にこの値をundefinedに初期化し、実行時に関数にオブジェクトを割り当てます.
範囲(scope):宣言の場所に応じて識別子(ex.変数名、関数名、クラス名など)の有効範囲を表します.グローバルに宣言された変数にはグローバルスキャンがあり、ゾーンに宣言された変数にはゾーンスキャンがあります.
グローバル変数は、任意の場所で参照可能な値であり、領域変数は、その領域スキャンおよびそのサブ領域スキャンで有効な値です.
JavaScriptでは、すべてのコードブロック(if、for、while、try/catch)が自分でブロックレベルスキャンを生成し、varキーワードとして宣言された変数は、関数のコードブロックを領域スキャンとして認定することによってのみ実行されます.
簡単に言えば、ブロックレベルスキャンでは、関数レベルスキャンのみを識別して動作する.
したがって、if文でvarを宣言すると、関数の外でvarキーを使用して宣言されるため、グローバル変数と見なされます.また、再宣言可能であるため、既存のa変数は、繰り返し宣言によって出力値を変更する可能性がある.
このサンプルコードは短いので、問題がどこにあるかはすぐにわかりますが、実際の操作ではできない可能性があります.場所に同じ名前がある場合、グローバル変数が再割り当てされたり、グローバルスキャンが共有されたりするため、予期せぬ結果になる可能性があります.
したがって、関数コードブロックのみを領域スキャンと認定するvarではなく、ブロックレベルスキャンをサポートするconstおよびletを使用することを推奨する.
前述したvarキーワードの問題は大きく3つの側面に分けられる.変数を繰り返し宣言し、予期せぬ値を返します. 関数レベルスキャンのため、関数の外部で宣言される変数はすべてグローバル変数です. 変数宣言文の前に、参照変数は常に未定義を返します.(護衛問題) ES 6のletとconstキーワードはvarの問題をどのように解決しますか?
変数の繰り返し宣言の問題
二人とも再宣言を阻止した.再割り当てはcontに限られますが、実際にはcontも元の値だけを再割り当てすることはできません.オブジェクトについては再割り当てできます.
かんすうレベルそういんもんだい
どちらもブロックレベルスキャンをサポートします.
護衛問題.
let letキーワードとして宣言された変数は、宣言ステップと初期化ステップから分離されます.これは、実行時の前に、まずJavaScriptエンジンによって宣言ステップ(=シースによって実行)が実行されますが、初期化ステップが実行されていないときに変数にアクセスしようとすると、参照エラーがポップアップされます. const contキーワードは宣言と初期化を同時に行います.
したがって、宣言はまだ行われていないため、初期化前に未定義のCannot access「name」文が表示されます.
ここで興味深いことに、誤った状態はブートを実行していない状態であると考えている人もいるので、letとconstはブートが不可能であることを示しています.
一部の人は、これは「プローブ」の「リフト」であり、その機能はすでに実行されているが、必要なブロックが欠けているためエラーが発生しているため、それ自体が「リフト」であると考えている.
護衛を現象と見なすか機能と見なすかの観点の違いといえる.
https://www.howdy-mj.me/javascript/var-let-const/
var, let, const
var=再宣言、再割り当て可能
let=xを再宣言し、再割り当て可能
const=xを再宣言し、xを再割り当て
javascriptで変数をvarとして宣言できますが、なぜconstとletが表示され、使用を推奨しますか?
このため、変数の宣言と割り当てプロセス、エスケープ、スキャンについて理解する必要があります.
≪変数|Variable|oraolap≫:値を格納するために使用されるメモリ領域自体またはそのメモリ領域の名前を識別します.
変数のコンポーネント:変数名、値、およびメモリアドレス
変数は、値ではなくメモリアドレスを記憶します.変数名を使用すると、JavaScriptエンジンは、変数名とマッピングされたメモリアドレスを介して格納された値を返します.
割り当て:変数に値を保存
参照:変数に格納されている値の取得
宣言:変数名をJavaScriptエンジンに通知する
分配と宣言の違いを覚えてください!
JavaScriptで変数を宣言する方法
JavaScriptでは,変数宣言は宣言→初期化の段階を経る.
ただし、実行時にコンソールに切り替えると、変数を宣言する前に未定義のエラーが表示されます.
これは,コード作成がJavaScript構文の特性であるためである.
がんばって
JavaScriptエンジンは、ソースコードが行単位で実行される前(=実行時以前)に、すべての宣言(ex.変数宣言、関数宣言など)を検索してドラッグ&ドロップし、最初にこれらの宣言を実行します.すなわち、変数宣言がどこにあるかにかかわらず、他のコードの前に実行されることが保証される.
ここで発生する問題は、宣言と割り当てが同時に行われないことです.
変数宣言と割当ては、割当て演算子(=)によって1つの文(statement)に簡略化できますが、2つの実行ポイントが異なる場合があります.
変数宣言は実行時より前に実行されますが、値の割り当てはソースコードの順序で実行される実行時に実行されます.
したがって、返される値はコンソールの実行位置に依存します.
狙いを定める
1.変数宣言(var、let、const)
2.関数宣言(関数a(){})
護衛の目標じゃない
1.関数式(consta=function(){})
2.矢印関数(consta=()=>{})
関数宣言は、宣言の前後の任意の場所で呼び出すことができますが、両方の宣言は変数エスケープとみなされるため、宣言+初期化が終了したコードでのみ呼び出されます.
関数宣言文の場合は、実行時の前にJavaScriptエンジンで実行され、関数コードです.ただし、関数式と矢印関数の場合は、実行時の前にこの値をundefinedに初期化し、実行時に関数にオブジェクトを割り当てます.
varに戻りスキャン
範囲(scope):宣言の場所に応じて識別子(ex.変数名、関数名、クラス名など)の有効範囲を表します.グローバルに宣言された変数にはグローバルスキャンがあり、ゾーンに宣言された変数にはゾーンスキャンがあります.
グローバル変数は、任意の場所で参照可能な値であり、領域変数は、その領域スキャンおよびそのサブ領域スキャンで有効な値です.
JavaScriptでは、すべてのコードブロック(if、for、while、try/catch)が自分でブロックレベルスキャンを生成し、varキーワードとして宣言された変数は、関数のコードブロックを領域スキャンとして認定することによってのみ実行されます.
簡単に言えば、ブロックレベルスキャンでは、関数レベルスキャンのみを識別して動作する.
したがって、if文でvarを宣言すると、関数の外でvarキーを使用して宣言されるため、グローバル変数と見なされます.また、再宣言可能であるため、既存のa変数は、繰り返し宣言によって出力値を変更する可能性がある.
var a = 1
if (true) {
var a = 5
}
console.log(a) // output: 5
varの代わりにlet、constを使用する:結論
このサンプルコードは短いので、問題がどこにあるかはすぐにわかりますが、実際の操作ではできない可能性があります.場所に同じ名前がある場合、グローバル変数が再割り当てされたり、グローバルスキャンが共有されたりするため、予期せぬ結果になる可能性があります.
したがって、関数コードブロックのみを領域スキャンと認定するvarではなく、ブロックレベルスキャンをサポートするconstおよびletを使用することを推奨する.
varとlet/constの違いの概要
前述したvarキーワードの問題は大きく3つの側面に分けられる.
変数の繰り返し宣言の問題
二人とも再宣言を阻止した.再割り当てはcontに限られますが、実際にはcontも元の値だけを再割り当てすることはできません.オブジェクトについては再割り当てできます.
かんすうレベルそういんもんだい
どちらもブロックレベルスキャンをサポートします.
護衛問題.
console.log(name) // output: Uncaught ReferenceError: name is not defined
let name = 'a'
これらが存在するがアクセスできない状態を「一時的死角」(Temporal Dead Zone:TDZ)と呼び、スキャンの開始点から初期化ステップの開始点までこの変数を参照できない.console.log(name) // output: Uncaught ReferenceError: Cannot access 'name' before initialization
const name = 'a'
letキーとして宣言すると、実行時までにキーが宣言され、JavaScriptエンジンには既に存在するが初期化されていないため、名前not definedが表示されます.ただし、constキーとして宣言すると、実行時までに宣言できません!したがって、宣言はまだ行われていないため、初期化前に未定義のCannot access「name」文が表示されます.
ハウスティン、let constでいいですか、できませんか。
ここで興味深いことに、誤った状態はブートを実行していない状態であると考えている人もいるので、letとconstはブートが不可能であることを示しています.
一部の人は、これは「プローブ」の「リフト」であり、その機能はすでに実行されているが、必要なブロックが欠けているためエラーが発生しているため、それ自体が「リフト」であると考えている.
護衛を現象と見なすか機能と見なすかの観点の違いといえる.
Reference
この問題について(sprinters#1 var、let、const、Hoisting), 我々は、より多くの情報をここで見つけました https://velog.io/@matt2550/스프린터스-1-var-let-const-Hoistingテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol