1

これは簡単な議論になりますが、私は今朝私が持っていた啓示についていくつかのフィードバックが欲しかっただけです。これを知って...

var addTwoNumbers = function(intOne, intTwo) {
    if ((typeof intOne == 'number') && (typeof intTwo == 'number')) {
        document.write(intOne + intTwo);
    } else {
        document.write('Unable to perform operation.');
    }
};

addTwoNumbers(3, 4);

...基本的にこれと同じように動作します...

(function(intOne, intTwo) {
    if ((typeof intOne == 'number') && (typeof intTwo == 'number')) {
        document.write(intOne + intTwo);
    } else {
        document.write('Unable to perform operation.');
    }
})(3, 4);

...自己呼び出し関数の最初の括弧のセットは、参照によって関数の実行をバイパスまたは回避するための「ツール」であると言うことですか?事実上、()メソッドの名前は実際にはメソッドの名前ではありませんか?また、関数は実行時に直接宣言されているので、変数名参照を使用する手法よりも高速ですか?ただ不思議です。

4

1 に答える 1

3

「自己呼び出し関数」(実際には「自己呼び出し」ではありません。明示的な呼び出しがあり、関数自体の外部にあります)が(慣例により)括弧で囲まれた部分式として記述されている理由は次のとおりです。

JavaScriptには、キーワードを含む2つの構造がありfunctionます。

  1. 関数宣言ステートメントは、関数オブジェクトを定義し、それをローカルスコープ(および関数のローカルスコープ内の名前にバインドしますが、今は無視します):

    function foo() { /* code */ }
    
  2. 関数のインスタンス化サブ式。式のコンテキストで関数オブジェクトを作成します。

    var f = function() { /* code */ };
    

問題は、2番目のものが必要なときに発生し、式ステートメントの先頭で必要になります。 ステートメントがキーワードで始まるfunction場合、パーサーは、2ではなく上記の1を実行していると見なします。したがって、関数のインスタンス化の前後に括弧を導入することにより(また、部分式の括弧は常に許可され、その値にはまったく影響しないことを忘れないでください)、キーワードの使用は上記の2として解釈されます。function

パーサーにステートメントを式として表示させる方法は他にもあります。

  • !function() { /* code */ }();
  • 0, function() { /* code */ }();
  • +function() { /* code */ }();

ほんの一例です。

パフォーマンスに関しては、ここでは問題になりません。私が注意することの1つは、識別子を関数オブジェクトにバインドするこの方法です。

var name = function() { /* code */ };

本当に良いことはありません:

function name() { /* code */ }

そしていくつかの点でそれはもっと悪いです。特に、関数宣言ステートメントを使用すると、スタックトレースに表示される名前が付けられますが、関数を定義すると表示されvarません。

于 2012-04-05T17:11:34.367 に答える