与function.apply一起使用'this'时接受的约定

时间:2011-07-31 05:58:36

标签: javascript

我正在尝试实现原始类型的波兰表示法计算器,我正在使用一个对象来定义每个操作。

这样调用

new RPNCalculator().calculate([4, 5, '+']);

将产生9或

的答案
new RPNCalculator().calculate([4, 5, '+', 3, 5, '+', '*']);

将产生72的答案。

代码在这里:

function RPNCalculator(arr) {

    this.calculate = function(arr) {
        var resultArr =[];
        for(var i=0; i < arr.length; i++) {
            if(typeof(arr[i]) == 'number') {
                resultArr.push(arr[i]);
            }
            else {
                var a = resultArr.pop();
                var b = resultArr.pop();
                var c = opers[arr[i]].apply(this, [a, b]);
                resultArr.push(c);
            }
        }
        return resultArr.pop();
    }

    var opers = {
        "+": function(a, b) { return a + b; },
        "-": function(a, b) { return a - b; },
        "*": function(a, b) { return a * b; },
        "/": function(a, b) { return a / b; }
    }
}

计算工作正常,但我想知道的是下一行

var c = opers[arr[i]].apply(this, [a, b]);

是根据数组中当前索引处的符号调用opers对象中包含的必需函数的最佳方法,还是有更好的方法来执行此操作?

1 个答案:

答案 0 :(得分:3)

您的代码中并不需要引用this,因为这些函数不适用于任何类成员。

在这种情况下,您只需执行以下操作:

var c = opers[arr[i]](a, b);

哪个更清洁一点。但是,为了最具可读性,我建议:

var operator = opers[arr[i]];
var c = operator(a, b);