你的编程语言可以这样做吗?

2019-06-03 20:43:40王旭

当你一想到作为参数的匿名函数,你也许想到对那些对数组里的每个元素进行相同操作的代码。 

  var a = [1,2,3];
  for (i=0; i<a.length; i++){
      a[i] = a[i] * 2;
  }
  for (i=0; i<a.length; i++){
      alert(a[i]);
  }
常常要对数组里的所有元素做同一件事,因此你可以写个这样的函数来帮忙: 

  function map(fn, a){
      for (i = 0; i < a.length; i++){
          a[i] = fn(a[i]);
      }
  }
现在你可以把上面的东西改成: 

  map( function(x){return x*2;}, a );
  map( alert, a );
另一个常见的任务是将数组内的所有元素按照某总方式汇总起来: 

  function sum(a){
      var s = 0;
      for (i = 0; i < a.length; i++)
          s += a[i];
      return s;
  }

  function join(a){
      var s = "";
      for (i = 0; i < a.length; i++)
          s += a[i];
      return s;
  }

  alert(sum([1,2,3]));
  alert(join(["a","b","c"]));
sum和join长得很像,你也许想把它们抽象为一个将数组内的所有元素按某种算法汇总起來的泛型函数: 

  function reduce(fn, a, init){
      var s = init;
      for (i = 0; i < a.length; i++)
          s = fn( s, a[i] );
      return s;
  }

  function sum(a){
      return reduce( function(a, b){ return a + b; }, a, 0 );
  }

  function join(a){
      return reduce( function(a, b){ return a + b; }, a, "" );
  }
许多早期的编程语言没法子做这种事。有些语言容许你做,却又困难重重(例如C有函数指针,但你要在別处声明和定义函数)。面向对象语言也不确保你用函数可以干些啥(把函数当对象处理?)。