函数调用后面有两组括号

202

我正在了解AngularJS中过滤器的工作原理,发现我们需要发送两组括号。

$filter('number')(number[, fractionSize])

这是什么意思,我们如何使用JavaScript来处理它?


8
我也认为这种语法阅读起来有些困难/别扭。但是,你可以按照这里描述的简化语法访问AngularJS过滤器:https://dev59.com/4WYq5IYBdhLWcg3wpyRE#14303362 - pkozlowski.opensource
我以angularjs为例。我想知道如果我自己创建一个函数,如何处理它。 - L105
7
实际上这被称为“柯里化”,是一种编程技术。 - Sajuuk
4个回答

400

这意味着第一个函数($filter)返回另一个函数,然后立即调用返回的函数。例如:

function add(x){
  return function(y){
    return x + y;
  };
}

var addTwo = add(2);

addTwo(4) === 6; // true
add(3)(4) === 7; // true

27
ES6箭头函数可以这样写: let add = (x) => (y) => x + y; - guido
4
称呼我为“新手”吧,但请抽出时间解释一下子函数是如何能够保存变量 x 的值。Sub函数可以访问其所属的父函数中声明的变量。当子函数被调用时,它可以使用该变量的当前值,并且如果在子函数中更改该变量的值,则该值也将更改在父函数中的对应变量的值。这被称为变量的作用域。因此,在子函数中使用变量 x 将访问到与父函数中相同的 x 变量。 - Vikas Bansal
3
在JavaScript中每次调用函数都会创建一个新的执行上下文,只要它内部引用了另一个函数,那么该执行上下文就会保留在内存中。 - Paul
20
为什么不像 add(x, y) 那样只传入2个参数呢?这样调用的好处在哪里? - Piotr Pawlik
2
谢谢这个解释!真的帮助我理解了passportjs身份验证的工作原理:passport.authenticate("local")(req, res, function(){ - tidydee
显示剩余5条评论

28

$filter('number') 返回一个函数,接受两个参数,第一个参数是必须的(一个数字),第二个参数是可选的(小数位数)。

可以立即调用返回的函数:

$filter('number')('123')

或者,您可以将返回的函数保留以备将来使用:

var numberFilter = $filter('number');

numberFilter('123')

这看起来很复杂:export const toursListQuery = gql` query ToursListQuery { tours { id name } } `; export default graphql(toursListQuery, { options: { pollInterval: 10000 }, })(ToursList); - stackdave

7

这与此相同:

var func = $filter('number');
func(number[, fractionSize]);

$filter() 函数返回另一个函数的指针。


2
使用ES6或更新版本,您可以这样做:
const divideBoth = (x) => (y) => {
   return x / y;
};

这种函数类型有用的一个原因是当你需要在React.js组件中使用回调函数时,而不是采用内联方式(即()=>返回值),你可以像我们之前所做的那样去做。但在事件回调中不建议使用,因为它会在第一次渲染时执行,有时可能会引起问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接