2015-09-29 16 views
6

私のインタビューの1つでこの問題が発生しました。私は何も答えを得ていないのでStackOverflowに入れてください変数への代入後に関数名を使用できない理由

JSの簡単な質問が1つありますが、私はそれの背後に理由を得ることはできません。以下はコードです。

var f = function foo(a, b) { 
    console.log(a + "-" + b); //f(1,2) will print 1-2 
    //foo(1,2) is undefined. 
} 

今私がf(1,2)を実行すると、正常に動作します。

もし私がfoo(1,2)を実行すると、undefined functionと表示されます。

これはなぜ発生していますか?関数をjs変数に代入した後、関数名で呼び出すことができないのはなぜですか?

+0

答えの1つを受け入れることを検討してください。 –

答えて

7

There are two ways to declare functions.

関数宣言:

function f(a,b) { } 

関数式:

var f = function foo(a, b) { } 
:関数式で

var f = function(a,b) { } 

は、あなたも、このような "内部" 関数名を指定することができます

名前fooは、関数内からのみ表示されます。これは通常、正しい自己参照を保証するために再帰関数で使用されます。

関数の宣言と式の違いの詳細については、ECMAScript 5仕様書、section 13を参照してください。

3

という名前の関数式(これはあなたのものです)の名前fooは、式自体でのみ使用できます。

MDN:関数本体の現在の関数を参照する場合は、名前付き関数式を作成する必要があります。この名前は、関数本体(スコープ)に対してのみローカルになります。

+0

名前と関数本体の間にあるのは、それをある変数に代入する場合だけです。 – Parashuram