Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以在运行时用Javascript创建函数吗?_Javascript_First Class Functions - Fatal编程技术网

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

可以在运行时用Javascript创建函数吗?,javascript,first-class-functions,Javascript,First Class Functions,维基百科关于一等公民的文章指出,“一些作者”认为函数在一种语言中只是一等公民,如果语言是一等公民的话。詹姆斯·科格兰(James Coglan)的这篇文章直截了当地将职能称为一等公民——我不知道他是否意识到关于一等公民标准的争议 以下是我的问题: 使用“在运行时创建”的附加标准,JavaScript过程是一流公民吗 值得一提的是,基于更一般化的标准(适用于其他对象),JavaScript函数显然是一流的公民,即它们可以作为变量传递;因此,我觉得上面提到的标准为对话增加了一种有趣的动态——或者至少

维基百科关于一等公民的文章指出,“一些作者”认为函数在一种语言中只是一等公民,如果语言是一等公民的话。詹姆斯·科格兰(James Coglan)的这篇文章直截了当地将职能称为一等公民——我不知道他是否意识到关于一等公民标准的争议

以下是我的问题:

  • 使用“在运行时创建”的附加标准,JavaScript过程是一流公民吗
  • 值得一提的是,基于更一般化的标准(适用于其他对象),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('*');