1

そこで、この単純な JavaScript コードに出くわしました。objectA が関数として定義されていないにもかかわらず、関数として呼び出されていることに驚きました。関数として呼び出されたときに objectA が機能するのはなぜですか?

function greaterThan(x) {
  return function(y) {
    return y > x;
  };
}

var objectA = greaterThan(10);
console.log(objectA(9));

これがJSFiddleです。

4

2 に答える 2

2

JavaScript プログラミング言語では、関数が第一級市民であることを知っておく必要があります。これは、関数を変数、配列、またはオブジェクトに格納できることを意味します。また、関数を関数に渡したり、関数から返したりすることもできます。最後の 1 つの動作は、ここで起こっていることです。greaterThan() 関数を呼び出すと、関数が得られます。ここでは、JavaScript コードの通常の動作です。

このコードを実行するとどうなるか見てみましょう:

alert(objectA instanceof Function);

理解を深めるために、次のコードを参照してください。

function greaterThan(x) {

       var result = function(y) {
            return y > x;
        };

       return result;

    }

greaterThan 関数を呼び出したときに得られるものは、単なる別の関数です。

このコードのもう 1 つの興味深い点は、この新しい関数が保存された x の値を維持する方法に関連しています。この概念はクロージャと呼ばれ、 JavaScript クロージャはどのように機能しますか?で詳しく説明します。.

于 2013-10-01T17:43:33.103 に答える
1

ええ、@Rob が前に言ったように、関数greaterThanは別の関数を返します。javascript は緩く型付けされた言語であるため、関数が返すものに制限はありません。

したがって、それに基づいて、動作はまったく期待どおりです。別の関数を返す関数を呼び出し、その新しい関数を変数に格納すると、その変数は関数自体になります...

Javascript は動的言語であり、通常の言語 (Java、C++、C# など) のようにデータ型やその他のものに制限がないことに注意してください。

乾杯。

于 2013-10-01T17:13:16.263 に答える