我正在通过Eloquent Javascript工作,我遇到了一个代码片段,如下所示:
function greaterThan(x) {
return function(y) {
return y > x;
};
}
var greaterThanTen = greaterThan(10);
show(greaterThanTen(9));
是否有任何真正的用例来定义这样的函数,并在其中使用匿名函数?这样做会不会简单得多:
function greaterThan(x,y){
return x > y;
}
var greaterThanTen = greaterThan(9, 10);
任何想法/意见/建议都会非常有用。
答案 0 :(得分:3)
This is an example of a "closure"。基本上,对greaterThan()
的调用会为您提供一个功能。该函数不仅仅是一个函数,而是带有x
的值 - 就像将x
的值永久地嵌入到函数中一样。
function obj(x) {
//"public interface"
//only these are exposed (inc and getX). x is private.
return {
inc: function() {
return ++x;
},
getX: function() { //a getter function to retrieve private x
return x;
}
}
}
//the value 10 is "embedded" to the returned object
var myobj = obj(10);
//every call to inc increments that "embedded" value
console.log(myobj.inc()); //11
console.log(myobj.inc()); //12
console.log(myobj.inc()); //13
//but you can never access the variable of `x` directly without a "getter"
console.log(myobj.getX());
闭包是JavaScript的一大特色。其中一个很好的用途是模拟私有变量。
答案 1 :(得分:1)
您正在组合函数的第一个示例。
当然你可以用不同的方式写作,但第一个例子中的greaterThanTen的想法是不同的。例如,您可以将其传递给过滤器
var a = [ 1 , 10, 100 , 9, 43 ];
function greaterThan(x) {
return function(y) {
return y > x;
};
}
var greaterThanTen = greaterThan(10);
a.filter(greaterThanTen);
返回[100,43]
这是函数式编程。有很多好处。
答案 2 :(得分:0)
除非我遗漏了某些内容,否则第一个代码会返回一个函数。 第二个返回结果。
答案 3 :(得分:0)
这不是一个特别好的用例。匿名函数的一个更好的用例是回调,如下所示:一旦函数#1完成,你希望执行函数#2。
function a(param1, param2, callback) {
//work on param1 and param2 here
callback.call(); //triggers the callback function
}