繁体   English   中英

将带有预设参数值的匿名函数作为参数传递

[英]Passing an anonymous function as a parameter with preset parameter values

我偶然遇到了这个问题,并且不确定我的“ 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函数。 它使用一个匿名函数并在收集两个参数后调用此函数(签出plus函数)。

我不确定这些参数的工作方式。 我一般理解参数,它们基本上是最终传递给函数的实际参数的占位符。

但是在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个值,然后将总数推回去。 我想编写一个函数来执行此操作,因此我不会经常重复自己。

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

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

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

也许您可以通过以下方式更好地可视化它:

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);
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM