2015-12-08 15 views
7

関数式に名前を付けても、関数式の名前を実際に参照できない場合はどうなりますか?関数式に名前を付けることができない場合は、関数式の名前を付けるポイントは何ですか?

var f = function g() { 
    console.log("test"); 
}; 

g(); // ReferenceError: g is not defined 
+1

https://kangax.github.io/nfe/ – SLaks

+0

は 'F()'のような呼び出し可能なその機能はありませんか? – cat

+0

私はそうは思わない。 –

答えて

10

ああ、あなたはです。その名前で参照してください。これらの名前はの中にしか存在しませんの機能の範囲です。

var f = function g() { 
    // In here, you can use `g` (or `f`) to reference the function 
    return 'test'; 
}; 

// It only exists as `f` here 
console.log(f()); 

DOCS:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function#Named_function_expression

+3

これの理由の1つは、ここで関数を参照するのに 'f'を使うと危険です。 'f'は関数式の後で' null'に再定義され、関数内で 'f()'を呼び出そうとすると投げられます。 – nrabinowitz

9

特に便利な点は、デバッグ時に役立つ点です。

エラーが発生すると、コンソールのスタックトレースに関数名が表示されます。それ以外の場合は、スタックトレース内の行は無名関数のみを参照します。

名前を付けることで、関数の目的をより明確にすることもできます。

+0

詳しい説明はありませんので、これはコメントとして表示されませんか? –

+1

完了。しかし、私はこの面についてもっと詳しく述べることはないと思います。とにかく、私はそれが答えの一部であるべきだと思います。 – lex82

+1

この特定の例では、関数が変数に代入されると、関数名は 'g'を省略すると' f'と推定されます。しかし、私はそれが他の文脈で役に立つと理解しています。 – kamilk

4

あなたの周りに渡された再帰関数を作成する場合、それは重要です。関数に名前を付けると、それ自体のスコープ内で自身を知ることができます。

ここでは、再帰関数を作成する一種のファクトリ関数を作成しました。再帰関数が正しく機能するためには、が必要です。

これは、モジュールエクスポートとして再帰関数を返すような、より広い意味で適用されると想像できます。非常に定義することで

var 
 
func = (function() { 
 
    return function rec (a) { 
 
    console.log(a); 
 
    return a >= 5 ? 'done' : rec(a + 1); 
 
    }; 
 
}), 
 
invoke = function (f, args) { 
 
    return f.apply(null, args); 
 
}; 
 

 
console.log(
 
    invoke(func(), [1]) 
 
);

1

、何を定義していることは匿名関数ではありません。

function [name]([param[, param[, ... param]]]) { 
    statements 
} 

名:

関数名。省略することができます。この場合、関数 は無名関数として知られています。あなたは今のvar名f()でそれを呼び出すことができますし、今では他の関数にパラメータとして関数を渡すことができるので

さらに、peoleの多くは匿名関数ではないと

var f = function() { 
    return 'test'; 
}; 

を検討します名前はfunctionThatTakesCallback(f)です。構文で

(function(when){ 
    console.log("run me :", when); 
})("right now"); 

あなたは:

$('#id').on('click', function(){ 
    console.log("I am anonymous"); 
}); 

か、すぐに実行する機能として:私の頭の中で

、真の無名関数は、コールバックに渡されたものとして、そのような一切の名前を持っていません現在、ES6(ほとんどのIEブラウザではこの機能を実装しています)では、f.namegです。あなたが再発し、それを使用することができ

1

をデバッグするときに便利です:

var f = function g (n, m) { 
    if (n>0) { 
     return g(n - 1, m = m + 'meta'); 
    } 
    return m + 'test'; 
}; 

console.log(f(10, 'super')); 
関連する問題