4

Wikipedia 关于一等公民的文章指出,“一些作者”认为,如果语言支持在运行时创建函数,则函数只是语言中的一等公民。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 回答