2015-07-05 2 views
2

Я хочу передать либо или, либо или неравную функцию как параметр для другой функции.Javascript, как передать логическую функцию по имени

Есть ли способ для того чтобы достигнуть что-то подобного следующим образом без использования сравнения строк используя вместо вызова функции:

function(x, y, z){ 
    if(z == "and"){ 
     return x && y; 
    } 
    if(z == "or"){ 
     return x || y; 
    } 
} 

Что я хочу:

function(x, y, func){ 
    func(x,y); //func can be passed as either and or or or other logical op. 
} 

Есть ли обобщающий для & & или || функционировать? Что-то похожее на operator.and или operator.or?

+2

Функции гражданами первого сорта, так что вы можете передать их в качестве аргументов. Ваш второй код работает. – Oriol

+0

Правильно, но есть ли стенограмма для && или || функционировать? Что-то похожее на operator.and или operator.or? – as3rdaccount

+0

Я не поклонник 'eval', но как насчет' eval'ing поведения функции? может ли это быть хорошим примером для использования 'eval'? –

ответ

1

Функции являются гражданами первого класса, поэтому вы можете передать их в качестве аргументов.

Я думаю, что нет собственных функций AND и OR, поэтому вы должны определить их вручную.

ES6 arrow functions позволяют определить их в очень короткий путь:

var f = (x, y, func) => func(x,y); 
f(foo, bar, (a,b) => a && b); // foo && bar 
f(foo, bar, (a,b) => a || b); // foo || bar 
0

Вы можете попробовать функции обратного вызова

function cb_and(x, y) { 
    return x && y; 
} 

function cb_or(x, y) { 
    return x || y; 
} 

function do(x, y, cb) { 
    cb(x, y); 
} 

Не уверен, если это то, что вы хотите; но это возможно.

2

В JavaScript вы можете передать любую функцию в качестве аргумента, так что-то, как это будет работать:

function and(x, y) { 
    return x && y; 
} 

function or(x, y) { 
    return x || y; 
} 

function operate(x, y, operation) { 
    return operation(x, y); 
} 

operate(true, false, and); // => false 
operate(true, false, or); // => true 
1

Вы можете передать функцию в качестве аргумента в JavaScript. В вашем случае, вы можете сделать что-то вроде:

Учитывая:

function doLogic(x, y, func){ 
    return func(x,y); // If you want the calculation result, return it too 
} 

Использование:

doLogic(false,false,function(a,b){ return a&&b }); // <-- false 
doLogic(false,true,function(a,b){ return a&&b }); // <-- false 
doLogic(false,true,function(a,b){ return a||b }); // <-- true 
0

Обычно эта идея абстрагируется немного в "функции предиката". По сути, если вашей функции нужен какой-то логический результат на основе аргумента (или нескольких аргументов), вы можете принять предикатную функцию от вызывающего, которая может делать все, что ему нужно, для вычисления значения.

function myMysteriousFunction(x, y, predicate) { 
    if (predicate(x, y)) { 
     // Do stuff 
    } 
} 

JavaScript не имеет какой-либо встроенный в первого класса ссылки к своим операторам, но ничего не мешает вам его определения в общем месте, если вам нужно использовать его:

var operators = { 
    and: function(x, y) { return x && y; }, 
    or: function(x, y) { return x || y; }, 
    equal: function(x) { return x == y; }, 
    // etc. 
}; 
Смежные вопросы