0

假设我们有这样的代码:

var movement = setInterval(function() {
    var position = 0; // Just some example values
    var limit = 200;  // to go with the code below

    if (position < limit) {
        position = position + 10;
    }
}, 500);

是否可以用变量替换<登录position < limit+登录position + 10(这样代码当然可以工作)?

如果是,最好的方法是什么?

4

4 回答 4

7

不完全是,但您可以使用功能图:

var comparators = {
    '<': function(a,b){return a<b},
    '<=': function(a,b){return a<=b}
};
var operators = {
    '+': function(a,b){return a+b},
    '/': function(a,b){return a/b}
};

var cp = '<', op = '+';
if (comparators[op](position, limit)) {
     position = operators[op](position, 10);
}

您还可以将函数保留在变量中:

var cp = comparators['<'];
if (cp(position, limit)) {
    ...

另外:如果您希望尽可能保持代码 DRY,您可以生成函数,例如为操作符生成函数:

var operators = {};
'+*/-'.split('').forEach(function(v){
  operators[v]=eval('(function(a,b){return a'+v+'b})');
});

好吧,主要是为了好玩:)

于 2013-06-01T16:27:04.893 回答
1

这可能是我认为的另一种方式:

http://jsfiddle.net/D9yqK/

var position = 0; 
var limit = 200; 
var x = '<'; // == , >= , <=, etc...
if(new Function('return '+position+x+limit)()) alert('ok');
于 2013-06-01T16:44:42.890 回答
1

创建一个函数,例如:

function process(left, op, right){
     var result;
     if(op == ">")
       result = left > right;
     else if(op == "<")
       result = left < right;
     else if(op == "+")
       result = left + right;
     else if(op == "-")
       result = left - right;
     return result;
}

if (process(position, "<", limit)) {
    position = process(position, "+", 10);
}
于 2013-06-01T16:28:36.697 回答
1

<并且+只是二元运算符,因此您可以将它们视为对具有两个参数的函数的调用。

例如:

var movement = setInterval(function() {
    var position = 0; // Just some example values
    var limit = 200;  // to go with the code below

    if (func1(position, limit)) {
        position = func2(position, 10);
    }
}, 500);

然后 func1 和 func2 可以随心所欲地定义,甚至可以是指向函数的变量。

例如:

var func1 = function(leftHandSide, rightHandSide) {
   return leftHandSize < rightHandSide;
}
于 2013-06-01T16:30:20.903 回答