可以在运行时用Javascript创建函数吗?
维基百科关于一等公民的文章指出,“一些作者”认为函数在一种语言中只是一等公民,如果语言是一等公民的话。詹姆斯·科格兰(James Coglan)的这篇文章直截了当地将职能称为一等公民——我不知道他是否意识到关于一等公民标准的争议 以下是我的问题:可以在运行时用Javascript创建函数吗?,javascript,first-class-functions,Javascript,First Class Functions,维基百科关于一等公民的文章指出,“一些作者”认为函数在一种语言中只是一等公民,如果语言是一等公民的话。詹姆斯·科格兰(James Coglan)的这篇文章直截了当地将职能称为一等公民——我不知道他是否意识到关于一等公民标准的争议 以下是我的问题: 使用“在运行时创建”的附加标准,JavaScript过程是一流公民吗 值得一提的是,基于更一般化的标准(适用于其他对象),JavaScript函数显然是一流的公民,即它们可以作为变量传递;因此,我觉得上面提到的标准为对话增加了一种有趣的动态——或者至少
下面是一个函数示例,该函数在运行时使用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
可以使用 更详细地说,这可用于应用任意二进制运算符:
function make_binary_fun(operator) {
return new Function('a', 'b', 'return a ' + operator ' b');
}
var adder = make_binary_fun('+');
var multiplier = make_binary_fun('*');
这和你的问题很相似,实际上这在技术上是不正确的。读一读关于一等公民职能的争论:(例如,互联网上有更多财富)是真的,但很少在现实生活中使用;塞缪尔·埃德温·沃德(Samuel Edwin Ward)回答中的例子更好,因为它通过日常JavaScript中使用的普通语言结构证明函数是一流的,而不是通过一个很少使用且相当邪恶的结构(与
eval
的原因相同)。问题并不完全清楚它的含义。答案是为同一个函数生成新的闭包,而不是新函数。我不认为这个问题是关于在现实生活中使用了什么,而只是一个关于语言设计和功能的一般性问题。这是一个陈词滥调的问题,从技术上讲,每次调用它都会生成一个新函数。不知道为什么这也不是一个有效的答案。(顺便说一句,我对两个都投了赞成票)我不确定JavaScript是否真的有“相同函数的新闭包”和“新函数”之间的区别。据我所知,它们都只是函数的不同实例。@Barmar如果你真的想用闭包的方式来做第二个例子,你只需在函数表达式中使用eval()
调用即可。如果我们要讨论这两种方法的局限性,函数
构造函数方式根本不允许您访问构成新函数
的函数的局部变量,这使得此方法的功能比闭包方法弱得多,并使许多有用的东西无法使用。@SamuelEdwinWard只想首先识别“大声说出”您的答案,以及最适合问题的答案。老实说,你和另一个之间的选择是任意的。谢谢你花时间回答问题。
function make_binary_fun(operator) {
return new Function('a', 'b', 'return a ' + operator ' b');
}
var adder = make_binary_fun('+');
var multiplier = make_binary_fun('*');