4

Wikipedia の第 1 級市民に関する記事では、「一部の作成者」は、言語が実行時の関数の作成をサポートしている場合、関数はその言語の第 1 級市民にすぎないと考えていると述べています。James Coglan によって書かれたこの記事は、明らかに関数をファーストクラスの市民と呼んでいます - 彼がファーストクラスの基準をめぐる論争を認識しているかどうかはわかりません。

ここに私の質問があります:

  1. 「実行時に作成する」という追加の基準を使用すると、JavaScript プロシージャーは第一級市民ですか?

より一般化された基準 (他のオブジェクト全体に適用可能) に基づくと、JavaScript 関数は非常に明らかに第一級の市民であることに注意してください。つまり、変数として渡すことができます。したがって、上記の基準は、あるユーザーが書いているように、「恣意的」ではない会話に興味深いダイナミクス、または少なくとも明確なダイナミクスを追加すると思います

  1. もしそうなら、実行時の関数の作成は JavaScript ではどのように見えるでしょうか (これは私たちがプロミス、コールバック、匿名などと呼んでいるものですか?)
  2. そうでない場合、関数の作成は別の言語での実行時にどのように見えますか?
4

2 に答える 2

14

関数はFunctionコンストラクターを使用して動的に作成できます

var adder = new Function('a', 'b', 'return a + b');

adder(3, 4); // returns 7

より精巧に言えば、これを使用して任意の二項演算子を適用できます。

function make_binary_fun(operator) {
    return new Function('a', 'b', 'return a ' + operator ' b');
}
var adder = make_binary_fun('+');
var multiplier = make_binary_fun('*');
于 2015-02-11T21:06:17.583 に答える
10

JavaScript で実行時に関数を作成する関数の例を次に示します。

function makeIncrementer(value) {
    return function(x) {
        return x+value;
    }
}

値を取り、その値を入力に追加する関数を返します。

これを呼び出す方法の例を次に示します。

var f = makeIncrementer(5);
f(2); // 7
f.call(null, 3); // 8
f.apply(null, [4]); /// 9
var object = {};
object.increment = f;
object.increment(5); // 10
于 2015-02-11T21:05:07.513 に答える