将匿名函数作为参数传递给预设参数值

时间:2014-04-13 22:11:03

标签: javascript

我偶然碰到了这个,我不确定我的'popAndGo'功能是如何工作的。

function Calculator(){
  var stack = [];

  var popAndGo = function(performer){
    var firstPop = stack.pop();
    var secondPop = stack.pop();
    var result = performer(firstPop, secondPop);
    stack.push(result);
  };

  this.push = function(num){
    stack.push(num);
  };
  this.value = function(){
    return stack[stack.length -1];
  };
  this.plus = function(){
    popAndGo(function(first, second){
      return first + second;
    });
  };
 }

我正在练习让我的代码遵循DRY练习,并创建了这个popAndGo函数。它需要一个匿名函数,并在收集两个参数后调用此函数(检查加号函数)。

我不确定这些参数是如何工作的。我一般都了解参数,它们基本上是你最终传递函数的实际参数的占位符。

但是在this.plus的情况下,我传递了一个带有两个参数的匿名函数。他们如何取代表演者(firstPop,secondPop)?我想象它是这样的:

  var popAndGo = function(performer){
    var firstPop = stack.pop();
    var secondPop = stack.pop();
    var result = performer(firstPop, secondPop);
    stack.push(result);
  };

  this.plus = function(){
    popAndGo(function(first, second){
      return first + second;
    });
  };
 }

 // CHECK the parameters on this popAndGo, this is how I picture this working.

 var popAndGo = function(function(first, second){ 
    var firstPop = stack.pop();
    var secondPop = stack.pop();
    var result = function(first, second);
    stack.push(result);
  };

这些值不匹配。如果有人能解释这个函数是如何传递到我的popAndGo函数并与值匹配的话,那么我就会清除很多混乱,谢谢!

测试用例我正在编写以下代码:

// See http://en.wikipedia.org/wiki/Reverse_Polish_notation
describe("Calculator using reverse polish notation", function() {
  var calculator;

  beforeEach(function(){ 
    calculator = new Calculator();
  });

  it("adds two numbers", function() {
    calculator.push(2);
    calculator.push(3);
    calculator.plus();
    expect(calculator.value()).toEqual(5);
  });

  it("adds three numbers", function() {
    calculator.push(2);
    calculator.push(3);
    calculator.push(4);
    calculator.plus();
    expect(calculator.value()).toEqual(7);
    calculator.plus();
    expect(calculator.value()).toEqual(9);
  });
}

我必须为它编写更多测试和更多功能。在每个函数中,我从堆栈中弹出2个值,然后重新开启。我想写一个函数,我这样做,所以我不是经常重复自己。

2 个答案:

答案 0 :(得分:2)

this.plus = function(){
    popAndGo(function(first, second){ 
      return first + second;
    });
};

作为参数传递给popAndGo的函数是一个带有两个参数的匿名函数。该匿名函数绑定到performer中的参数popAndGo

使用performerfirstPop的值调用secondPop时,这些值将绑定到匿名函数中的参数firstsecond。执行匿名函数的主体返回参数的总和。

答案 1 :(得分:2)

也许你会用这种方式更好地想象它:

var popAndGo = function(){
    var performer = function(first, second){
        return first + second;
    };
    var firstPop = stack.pop();
    var secondPop = stack.pop();
    var result = performer(firstPop, secondPop);
    stack.push(result);
};

或者,简化,

var popAndGo = function(){
    var firstPop = stack.pop();
    var secondPop = stack.pop();
    var result = firstPop + secondPop;
    stack.push(result);
};