機能巻上げ✨
9437 ワード
イントロ
私の最後のポストでは、我々は詳細にホーニングと変数巻き上げについて議論しました.どのように変数を巻いて動作を理解すると、機能の巻上に移動しましょう.
テストあなたの知識
次の3つのsayHelloo ()の結果を説明できますか?
sayHello()
function sayHello () {
function hello () {
console.log('Hello!')
}
hello()
function hello () {
console.log('Hey!')
}
}
sayHello()
function sayHello () {
function hello () {
console.log('Hello!')
}
hello()
var hello = function () {
console.log('Hey!')
}
}
sayHello()
var sayHello = function () {
function hello () {
console.log('Hello!')
}
hello()
function hello () {
console.log('Hey!')
}
}
答えはねえ!こんにちは!そして、3番目のものは実際にTypeErrorをもたらします.あなたがこれらの権利を推測しない場合は心配しないでください.最後にいくつかのクイズがあるだろうし、それまでに、あなた自身が機能を巻いて快適に見つけることができます.
機能巻上げ
変数の巻き上げからこの例を覚えていますか?
console.log(x)
var x
// undefined
ここでのキーは、Xがその宣言の前に利用可能だったことでした.関数の宣言に同じロジックが適用されます.sayHello()
function sayHello () {
console.log('Hello!')
}
// Hello!
この例では、3行目から宣言前にSayHello関数を呼び出します.私は宣言されていない機能を呼んでいるようですが、私はそれを使用することができますし、それはこんにちはを印刷!これは機能巻上げのおかげです.メモリ作成フェーズ中に、JavaScriptエンジンは、関数のキーワードによって関数宣言を認識し、それを立ち上げました.言い換えれば、JavaScriptエンジンは、移動する前に、メモリに入れて関数を利用可能にしました.このため、実行フェーズで宣言前にSayHello関数にアクセスできました.
それではこれはどうですか.次のコードは何をするかわかりますか?
sayHello()
var sayHello = function () {
console.log('Hello!')
}
うーん、それは正しいです-それはTypeErrorになります.うーん、なんだ!場面の背後に何が起こっているかを完全に理解するために、関数宣言と関数式の違いを知る必要があります.その最初に少し時間をかけましょう.
関数宣言対関数式
JavaScript関数と関数式の中で、関数のキーワードを持つ関数を定義する方法は2つあります.
関数の宣言は関数のキーワードで始まり、関数の名前(SayHello)を呼び出し、関数が呼び出されたときに実行されるコードのブロック({ console . log (' hello !'))を呼び出します.
function sayHello() {
console.log('Hello!')
}
sayHello()
// Hello!
一方、関数式を使用すると、名前のない関数や非機能コードブロックの一部を定義できます.関数式の典型的な使用法は、関数を変数に代入することです.以下、匿名関数、つまり名前のない関数を定義しています.そして、変数(var sayhello =)にそれを割り当てるので、私は後でSayHelloを通して機能を参照することができます.var sayHello = function() {
console.log('Hello!')
}
sayHello()
// Hello!
もし私がこれらの関数を定義した後にコールするなら、SayHelp ()を使って同じように呼び出すことができます.しかし、JavaScriptエンジンが最初にそれらを見たとき、それは非常に異なる方法でそれらを扱います.関数式は
例2に戻りましょう.これはTypeErrorを投げました.SayHelloは機能ではなく、JavaScriptエンジンの視点から一歩一歩起こっていることを通り抜けます.
sayHello()
var sayHello = function () {
console.log('Hello!')
}
メモリ作成フェーズ中に、JavaScriptエンジンは、3行目のvarキーワードに遭遇します.JavaScriptエンジンが変数宣言に何をしているか覚えていますか?はい、それは値で変数をホイストします:未定義.そして、それは変数開始をホイストしません.さて、typeerrorは意味を持ち始めます.変数宣言( var sayhello )は未定義の値で囲んでいました.ただし、変数の初期化(= function ()\console . log ( hello !))立ち上げられなかった.したがって、実行が行1に達して、SayHelloに電話をしようとすると、それは失敗しました.SayHello変数が行3の実行中に関数式に代入された後のみ、SayHelp ()で関数を呼び出すことができます.これを次のように証明することができます.
console.log(sayHello)
var sayHello = function () {
console.log('Hello!')
}
sayHello()
// undefined
// Hello!
得た?
すべてのフィードバック、質問、またはトピックの要求を投稿してください.私も感謝👏 あなたがポストのような場合、他の人もこれを見つけることができます.
Reference
この問題について(機能巻上げ✨), 我々は、より多くの情報をここで見つけました https://dev.to/abdulazizcode/function-hoisting-5ea4テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol