JavaScript声明を深く理解し、向上させる.
5834 ワード
JavaScriptにおける変数宣言の昇格
まずコードを見にきます.
JavaScriptの関数宣言のアップグレード
同じように、コードを見ます.
このコードをブラウザで解析する前に、関数1と関数4はこのスコープの一番上に引き上げられます.関数1は関数4と同名ですので、関数4は関数1を上書きします.関数2、3、5、6は変数アップグレードであり、コードが実行されているときだけ関数が宣言された変数に与えられるので、出力の結果は4、4、2、3、3、5、6です.しかし、一部の学生が疑問を持っているかもしれません.構造関数で作成したaも声明を上げます.なぜ最初の出力は4で、エラーやundefinedではないですか?実は理屈は簡単です.関数6と関数4の関係は以下の通りです.
まずコードを見にきます.
console.log(a) //undefined
var a = 1
上の二つの行のコードは理解に難くないです.var定義の変数宣言は本作用領域の上部に引き上げられます.上の2行のコードは下の3行のコードと同じです.var a
console.log(a)
a = 1
また来ますconsole.log(a) //
a = 1
前に述べましたが、var定義の変数宣言だけがアップグレードされます.私たちは続けますvar a = 1
function test() {
console.log(a) //undefined
var a = 2
console.log(a) //2
}
test()
関数testにはvar a=2があり、変数宣言が本作用領域のトップに引き上げられ、var a=2の作用域はtest関数であるため、出力はundefinedであり、2は1,2ではなくundefinedである.JavaScriptの関数宣言のアップグレード
同じように、コードを見ます.
console.log(a) //function a()
function a() {}
上記の例から、JavaScriptにも関数声明が存在していることが分かります.また、関数声明全体が本作用領域のトップにアップグレードされます.なぜ関数声明がアップグレードされているのか、続いて見ます.console.log(a) //undefined
var a = function () {}
関数式を使って関数を定義すると変数が上昇しますが、関数宣言の向上はありません.もちろん、関数宣言と関数表現の2つの方法だけではなく、構造関数の定義関数が存在するかどうかを確認してみましょう.console.log(a) //undefined
var a = new Function()
構造関数で定義された関数には変数が存在しますが、関数宣言の昇格はありません.急に明るくなりましたか?まず焦らないでください.下のコードを見てみます.何か意外な発見があるかもしれません.console.log(a())
function a() {return 1} // 1
console.log(a())
var a = function () {return 2} // 2
console.log(a())
var a = new Function('return 3') // 3
console.log(a())
function a() {return 4} // 4
console.log(a())
var a = function () {return 5} // 5
console.log(a())
var a = new Function('return 6') // 6
console.log(a())
答えは4、4、2、3、5、6です.もしあなたの答えと正しい答えが違ったら、あなたは本当に関数を理解していないかもしれません.このコードをブラウザで解析する前に、関数1と関数4はこのスコープの一番上に引き上げられます.関数1は関数4と同名ですので、関数4は関数1を上書きします.関数2、3、5、6は変数アップグレードであり、コードが実行されているときだけ関数が宣言された変数に与えられるので、出力の結果は4、4、2、3、3、5、6です.しかし、一部の学生が疑問を持っているかもしれません.構造関数で作成したaも声明を上げます.なぜ最初の出力は4で、エラーやundefinedではないですか?実は理屈は簡単です.関数6と関数4の関係は以下の通りです.
function a() {return 4} // 4
var a // 6 a , a
console.log(a)
//function a() {return 4} // 4,
var a = new Function('return 6') // 6
まとめ:var定義の変数宣言は、このスコープのトップに引き上げられますが、関数宣言は全体としてトップに引き上げられ、関数宣言の優先度はvar定義の変数宣言よりも高くなります.