2

私は Eloquent Javascript を使って作業していますが、次のようなコード スニペットに出会いました。

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

var greaterThanTen = greaterThan(10);
show(greaterThanTen(9));

このような関数を内部に無名関数で定義する実際のユースケースはありますか? これを行う方がはるかに簡単ではないでしょうか:

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

var greaterThanTen = greaterThan(9, 10);

アイデア/コメント/提案は非常に役に立ちます。

4

4 に答える 4

3

これは「閉鎖」の例です。基本的に、への呼び出しgreaterThan()は関数を提供します。その関数は、単なる関数ではなく、 の値を持っています。これは、 の値を関数に永続的にx埋め込むようなものです。x

function obj(x) {

    //"public interface"
    //only these are exposed (inc and getX). x is private.
    return {
        inc: function() {
            return ++x;
        },
        getX: function() { //a getter function to retrieve private x
            return x;
        }
    }
}

//the value 10 is "embedded" to the returned object
var myobj = obj(10);

//every call to inc increments that "embedded" value
console.log(myobj.inc()); //11
console.log(myobj.inc()); //12
console.log(myobj.inc()); //13

//but you can never access the variable of `x` directly without a "getter"
console.log(myobj.getX());​

クロージャーは、JavaScript の優れた機能の 1 つです。その優れた用途の 1 つは、プライベート変数をエミュレートすることです。

于 2012-05-16T12:42:56.560 に答える
1

関数を組み合わせている最初の例。

もちろん、さまざまな方法で書くことができますが、最初の例での greaterThanTen の考え方は別のものです。たとえば、これをフィルターに渡すことができます

var a = [ 1 , 10, 100 , 9, 43 ];

function greaterThan(x) {
  return function(y) {
    return y > x;
  };
}
var greaterThanTen = greaterThan(10);
a.filter(greaterThanTen);

[100, 43] を返します

関数型プログラミングです。多くの利点があります。

于 2012-05-16T12:44:14.863 に答える
0

それは特に良いユースケースではありません。関数 #1 が完了したら、関数 #2 を実行したいとします。

function a(param1, param2, callback) {
    //work on param1 and param2 here
    callback.call(); //triggers the callback function
}
于 2012-05-16T12:43:21.747 に答える
0

何かを見逃していない限り、最初のコードは関数を返します。2 つ目は結果を返します。

于 2012-05-16T12:42:00.340 に答える