識別子機能は、多くの場合、関数宣言中の関数名を省略することができず、関数式を省略することができると言われています。
我々はすべて知っているように、ジャバスクリプトエンジンは、変数名、関数名として扱われますので、コマンドの使用はときに関数ステートメント機能可変リフトは、コードの先頭に昇進したとして、全体の機能は同じになります。だから、最初の実装の関数宣言も文句はありませんが、式が機能します。
次のコードの場合
foo();
bar();
var foo=function bar(){
console.log(1);
}
プロモーションを強化するために私たちの理論変数や関数によると、確かにエラー、実際に実行することができます
FOO(); //キャッチされない例外TypeError:fooが関数ではありません
バー(); //キャッチされていないにReferenceError:バーが定義されていません
私の理解ではと同等、変数fooを上げて、始まりです
var foo //undefined
foo=function bar(){
console.log(1);
}
通常の定義された:ブラウザはバーがにReferenceErrorが与えられているのか分かりません。次のそれはそう:
var foo=function bar(){
console.log(1);
}
bar();
若しくは
new function bar(){//作为New表达式(NewExpression)的一部分,它也是函数表达式
console.log(1);
}
bar();
バーに定義されていません://キャッチされないにReferenceError;結果はまだバーを()が実行されています。バーがまだ定義されている理由と想像力は、実行しない、ああ一致していませんか?機能識別子を変数名として扱われているので、その関数式の識別子は、どのように見つけることができませんでしたので、どこでその範囲?
だから、次のコードで:
var foo = function bar(){
console.log(bar);
}
foo();
次のように印刷結果は以下のとおりです。
ƒバー(){
にconsole.log(バール)
}
案の定アイデア右、体内での独自の機能の関数式のスコープ識別子。関数名は、あなたが呼び出したい場合は、関数式を呼び出し、そして唯一の再帰の場合はできません。
加えて、検索エンジンを使用して識別子の関数式に、このような卵を見つけるために次のように、一例です。
var f1 = function b1(){
return f2();
}
var f2 = function b2(){
return f3();
}
var f3 = function b3(){
debugger;
}
f1();
各関数は、識別子を与えた場合は、コールスタックは、呼び出される関数の名前が表示されます
それは比較的明るくすることができないです√