関数式/関数名の識別子

識別子機能は、多くの場合、関数宣言中の関数名を省略することができず、関数式を省略することができると言われています。

我々はすべて知っているように、ジャバスクリプトエンジンは、変数名、関数名として扱われますので、コマンドの使用はときに関数ステートメント機能可変リフトは、コードの先頭に昇進したとして、全体の機能は同じになります。だから、最初の実装の関数宣言も文句はありませんが、式が機能します。

次のコードの場合

  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();

各関数は、識別子を与えた場合は、コールスタックは、呼び出される関数の名前が表示されます

それは比較的明るくすることができないです√

发布了1 篇原创文章 · 获赞 2 · 访问量 1万+

おすすめ

転載: blog.csdn.net/u011927449/article/details/104055329