我偶然碰到了这个,我不确定我的'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个值,然后重新开启。我想写一个函数,我这样做,所以我不是经常重复自己。
答案 0 :(得分:2)
this.plus = function(){
popAndGo(function(first, second){
return first + second;
});
};
作为参数传递给popAndGo
的函数是一个带有两个参数的匿名函数。该匿名函数绑定到performer
中的参数popAndGo
。
使用performer
和firstPop
的值调用secondPop
时,这些值将绑定到匿名函数中的参数first
和second
。执行匿名函数的主体返回参数的总和。
答案 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);
};