Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.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 add(1)(2)(3).total==6-还有人见过这样使用自返回函数吗?_Javascript - Fatal编程技术网

Javascript add(1)(2)(3).total==6-还有人见过这样使用自返回函数吗?

Javascript add(1)(2)(3).total==6-还有人见过这样使用自返回函数吗?,javascript,Javascript,下面的代码可以工作,虽然我理解它为什么可以工作,但我在任何地方都没有看到它。我认为这是因为所有其他设计模式都要好得多 我仍然希望看到这个例子是一个警示故事,但我没有 当然,这很糟糕,尤其是我选择了下面的例子,因为很清楚它的作用,但是: 这种模式叫什么 它常用吗 是否有使用此模式的合法项目 var add = function container (val) { addFunc = function f (val, undefined) { addFunc.total += val;

下面的代码可以工作,虽然我理解它为什么可以工作,但我在任何地方都没有看到它。我认为这是因为所有其他设计模式都要好得多

我仍然希望看到这个例子是一个警示故事,但我没有

当然,这很糟糕,尤其是我选择了下面的例子,因为很清楚它的作用,但是:

这种模式叫什么

它常用吗

是否有使用此模式的合法项目

var add = function container (val) {

  addFunc = function f (val, undefined) {
  addFunc.total += val;
  return addFunc;
  };

addFunc.total = 0;

return addFunc(val);
};

alert(add(1)(2)(3).total);
alert(add(1)(2)(33).total);

编辑:更改变量名,使代码在IE中工作。

从技术上讲,这可以被视为链接或封装

当您可以无限期地执行一组与原始函数不同的操作时,您可以创建链。当您可以链接调用以设置原始选择器的属性和属性时,jQuery使用这种形式。在这种情况下,创建者希望能够链接要添加的调用,而无需重新键入函数名。不是最干净的想法,但有效


此外,由于代码的实际主体从未向调用方公开,因此这也可以被视为封装,因为
addFunc
方法未向外部范围公开

如果您能:

function add() {
    var l = arguments.length, i, sum = 0;
    for( i=0; i<l; i++) sum += arguments[i];
    return sum;
}
alert(add(1,2,3)); // 6
函数添加(){
var l=参数。长度,i,和=0;
因为(i=0;i这被称为咖喱。来源于哈斯克尔咖喱(但最初由摩西·伊里奇·舍芬克尔开发)

一种转换函数的技术,该函数采用多个参数(或一个参数的n元组),可以作为一个函数链调用,每个函数都有一个参数(部分应用程序)

自2010年起:

何时使用curry-当您发现自己调用了相同的函数并传递了几乎相同的参数时,该函数可能是curry的一个很好的候选者。您可以通过对函数部分应用一组参数来动态创建新函数。新函数将保存重复的参数(因此您不必每次都传递它们),并将使用它们预填充原始函数所期望的完整参数列表


另一个来自Dustin Diaz。

这是一个函数式编程概念,称为

基本上,给定一个
函数foo(a,b,c)
您将创建一个
函数条(a)
,该函数条返回
函数条2(b)
,返回给出最终答案的
函数条3(c)

从技术上讲,这不是真正的currying,因为它无限地进行,并使用副作用(total
属性)来打破无限循环

但在任何情况下,这种模式都可能有有用的应用。它特别适用于遍历树结构,在树结构中,您正在为树的每个叶计算结果,结果取决于该叶的祖先。您在根节点上运行curried函数,然后在每个子节点上运行返回的函数,然后然后,对于这些子节点中的每一个,等等。如果一个纯curried函数运行的节点有子节点,那么它将返回另一个函数;如果您到达了一个叶节点,那么它将返回所需的值

该代码将是一个简单的递归函数,它向自身传递一个新的“根”节点和解析该节点的函数,该函数始终使用一个参数

但是,它在这里的使用方式看起来更像是一种学习练习,而不是有用的东西

编辑:如果您想使其成为纯currying函数,但仍然具有准无限递归,则输入数据需要提供停止信息(就像C字符串使用值
0x00
定义
EOF
):


然后,
add(1)(2)(3)(null)==6
并且没有
.total
副作用参数。

这个设计模式看起来更像一个谜,而不是一个干净的代码:)但是你为什么要这样做呢?!这个模式对我来说并不可怕。读起来很清楚。我想我更愿意把
total
看作是一个局部变量,把
.total
属性看作是一个返回结果并重设变量的方法。@user989370:为什么?你有什么特别不喜欢的地方吗u?我不知道代码怎么会更清晰。@amnotiam-我很高兴,清晰是我写示例时的目标。这不是我见过的东西,它是我打字的结果,我写示例是因为它很容易理解。
我想我的主要反对意见是:我什么时候会使用它?
至于阅读能力,我们有:
add(1)(2)(3)vs add(1)。add(2)。add(3)vs add(1,2,3)。add(1,2,3)以简洁取胜,我喜欢add(1)(2)(3)因为在更复杂的示例中,很明显是3个独立的操作按顺序完成,而不是一个使用3个参数的函数。我认为最明显的改进是-1+2+3。显然,我使用它的示例仅用于说明,而不是任何人都会做的事情(我希望!).我对它没什么用处,我自己也没用过。我是创造者-我不是真的有目的地创作它,它是我把一个输入错误整理成一个工作示例的结果,但你说的其余部分都很完美。可以说,我没想到会先做它,我希望它有个名字,有流行音乐的东西,比如“自调用匿名函数”-有一个名字你不会忘记的。我忘了:我以前见过方法链接(在jQuery中我很喜欢它)我理解它的工作原理,我主要是想理解为什么是这种方式而不是另一种方式。因为整个代码可以用1+2+3替换-它肯定不是用来这样使用的,这只是为了显示它实际运行。嘿,刚刚添加了一个纯咖喱版本的加法器供您检查。感谢这个例子-总数部分是最后,我用我的例子来说明它的工作原理
var add = (function() {
    var total = 0;
    return function nextAdd(a) {
        if(a != null) {
            total += a;
            return nextAdd;
        } else {
            return total;
        }
    };
})();