2

我正在通过 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);

任何想法/评论/建议都会非常有帮助。

4

4 回答 4

3

这是一个“闭包”的例子。基本上,调用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 的一大特色。它的一大用途是模拟私有变量。

于 2012-05-16T12:42:56.560 回答
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]

它是函数式编程。有很多优点。

于 2012-05-16T12:44:14.863 回答
0

除非我错过了什么,否则第一个代码会返回一个函数。第二个返回结果。

于 2012-05-16T12:42:00.340 回答
0

这不是一个特别好的用例。匿名函数的更好用例是回调,例如:您希望在函数 #1 完成后执行函数 #2。

function a(param1, param2, callback) {
    //work on param1 and param2 here
    callback.call(); //triggers the callback function
}
于 2012-05-16T12:43:21.747 回答