typeofの一時死区について、調べてみます.
2458 ワード
知識を能力に変換して、核心は20%の業界の核心の技能を掌握するので、学習を習慣に育成して、持続的に深く耕して、能力で問題を解決して、やっと持続的に成長することができます!基礎がいいということは、必須条件です.
最近データタイプを見て、データタイプの判断には3つの方法があります.
「一時性死区」ですか?これは何ですか?了解してください.これから本題に入ります.
一時死地
ブロックレベルのスコープ内にletコマンドが存在する限り、その宣言した変数は「バインディング」(binding)という領域になり、外部の影響を受けなくなる.
ES 6は、ブロック内にletとconstコマンドが存在する場合、このブロックがこれらのコマンドに対して宣言する変数は、最初から閉鎖作用領域を形成することを明確に規定している.宣言する前にこれらの変数を使うと、エラーが発生します.
つまり、コードブロック内では、letコマンドを使用して変数を宣言する前に、この変数は使用できません.これは文法的には「一時的なデッドゾーン」と呼ばれています.
「一時死区」もtypeofが100%安全な操作ではないことを意味します.
比較として、もし変数が宣言されていないなら、typeofを使うと、逆にエラーが発生しません.
いくつかの「デッドゾーン」は比較的に隠れています.見つけにくいです.
締め括りをつける
ES 6は、一時的なデッドエリアとlet、constステートメントに変数のアップグレードがないことを規定しています.主に運行時のエラーを減らすために、変数宣言前にこの変数を使用することを防止して、予想外の行動を招いています.このようなエラーはES 5でよく見られます.このような規定があるので、このような間違いを避けるのは容易です.
つまり、一時的なデッドゾーンの本質は、現在のスコープに入ると、使用する変数が既に存在しますが、取得できないのは、宣言変数の行のコードが現れるまで、その変数を取得して使用することができます.
最近データタイプを見て、データタイプの判断には3つの方法があります.
typeof
はその中の一つです.主にベースタイプを判断します.「一時性死区」ですか?これは何ですか?了解してください.これから本題に入ります.
一時死地
ブロックレベルのスコープ内にletコマンドが存在する限り、その宣言した変数は「バインディング」(binding)という領域になり、外部の影響を受けなくなる.
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
上のコードには、グローバル変数tmpがありますが、ブロックレベルのスコープ内のletはまた、局所変数tmpを宣言しています.このブロックレベルのスコープを結合させるため、letが変数を宣言する前に、tmp割当値に対してエラーが発生します.ES 6は、ブロック内にletとconstコマンドが存在する場合、このブロックがこれらのコマンドに対して宣言する変数は、最初から閉鎖作用領域を形成することを明確に規定している.宣言する前にこれらの変数を使うと、エラーが発生します.
つまり、コードブロック内では、letコマンドを使用して変数を宣言する前に、この変数は使用できません.これは文法的には「一時的なデッドゾーン」と呼ばれています.
if (true) {
// TDZ
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
上のコードは、letコマンドが変数tmpを宣言する前に、変数tmpの「デッドゾーン」に属します.「一時死区」もtypeofが100%安全な操作ではないことを意味します.
typeof x; // ReferenceError
let x;
上記のコードの中で、変数xはlet命令声明を使用していますので、声明の前にxの「デッドゾーン」に属しています.この変数を使うとエラーが発生します.そのため、typeofを実行するとReferenceErrが投げ出されます.比較として、もし変数が宣言されていないなら、typeofを使うと、逆にエラーが発生しません.
typeof undeclared_variable // "undefined"
上のコードの中で、undeclared_variableは存在しない変数名です.結果として「undefined」に戻ります.ですから、letがない前に、typeof演算子は100%安全です.いつまでも間違いないです.今はこの点が成立しない.このような設計は皆さんに良いプログラミング習慣を身につけるために、変数は必ず声明の後で使います.でないと、エラーを報告します.いくつかの「デッドゾーン」は比較的に隠れています.見つけにくいです.
function bar(x = y, y = 2) {
return [x, y];
}
bar(); //
上のコードの中で、bar関数を呼び出してエラーが発生したのは、パラメータxのデフォルト値が別のパラメータyに等しいためであり、yはまだ宣言されていません.デッドゾーンに属しています.yのデフォルト値がxであれば、エラーは発生しません.この時点でxはすでに宣言されています.function bar(x = 2, y = x) {
return [x, y];
}
bar(); // [2, 2]
また、以下のコードもエラーとなります.varの行動とは違います.//
var x = x;
//
let x = x;
// ReferenceError: x is not defined
上記のコードが間違っていたのも、一時的にデッドタイムのためです.letを使って変数を宣言した場合、変数がまだ完成していない前に使用すると、エラーが発生します.上記の行はこの状況に属しています.変数xのステートメントがまだ実行されていない前に、xの値を取りに行きます.エラーが発生しました.xは定義されていません.締め括りをつける
ES 6は、一時的なデッドエリアとlet、constステートメントに変数のアップグレードがないことを規定しています.主に運行時のエラーを減らすために、変数宣言前にこの変数を使用することを防止して、予想外の行動を招いています.このようなエラーはES 5でよく見られます.このような規定があるので、このような間違いを避けるのは容易です.
つまり、一時的なデッドゾーンの本質は、現在のスコープに入ると、使用する変数が既に存在しますが、取得できないのは、宣言変数の行のコードが現れるまで、その変数を取得して使用することができます.