可以在Javascript中在运行时创建函数吗?

Tho*_*mas 3 javascript first-class-functions

维基百科关于一等公民的文章指出,"一些作者"认为,如果语言支持在运行时创建,那么函数只是一种语言中的一等公民.James Coglan撰写的这篇文章明确地将职能视为一流的公民 - 无论他是否意识到有关一流标准的争议,我不知道.

这是我的问题:

  1. 使用"在运行时创建"的附加标准,JavaScript程序是一流的公民吗?

值得一提的是,基于更广义的标准(适用于大多数其他对象),JavaScript函数显然是一等公民,即它们可以作为变量传递; 因此,我觉得上面提到的标准增加了一个有趣的动态 - 或者至少是一个澄清的动态 - 给对话而不是 - 就像一个用户写的那样 - "任意".

  1. 如果是这样,在运行时创建一个函数在JavaScript中是什么样的(这就是我们称之为promises,回调,匿名等)?
  2. 如果没有,在另一种语言的运行时,函数的创建是什么样的?

Bar*_*mar 13

可以使用构造函数动态创建Function函数

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

adder(3, 4); // returns 7
Run Code Online (Sandbox Code Playgroud)

更精细的是,这可以用于应用任意二元运算符:

function make_binary_fun(operator) {
    return new Function('a', 'b', 'return a ' + operator ' b');
}
var adder = make_binary_fun('+');
var multiplier = make_binary_fun('*');
Run Code Online (Sandbox Code Playgroud)

  • @Barmar如果你真的想要用闭包方式做第二个例子,你只需要在函数表达式中使用`eval()`调用.如果我们要讨论这两种方法的局限性,那么`Function`构造函数方法根本不允许您对构造`new Function`的函数的局部变量进行任何访问,这将呈现这种方法严格来说不如闭包方法那么强大,并且用它来做许多有用的事情. (2认同)

Sam*_*ard 8

这是一个在JavaScript中在运行时创建函数的函数示例:

function makeIncrementer(value) {
    return function(x) {
        return x+value;
    }
}
Run Code Online (Sandbox Code Playgroud)

它接受一个值,并返回一个将该值添加到其输入的函数.

以下是调用它的方法的一些示例:

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
Run Code Online (Sandbox Code Playgroud)