2016-03-01 3 views
1

Я хотел бы создать функцию «когда», которая будет работать как обычная команда или просто функция и сможет переоценить ее параметры. , например:Javascript - параметр оценки снова

when(k==0) { 
    do something; 
} 

или

when(k==0, function() { 
    do something; 
}); 

Дело в том, что к теперь, например, равным 1, и эта функция должна всегда переоценивать K == 0 в детерминированной если он изменено на 0.

* Я не хочу отправлять k == 0 как строку 'k == 0'.

Возможно ли это? Если да, то как?

* Это академический вопрос, пожалуйста, не объясняйте, почему так неправильно создавать эту функцию.

+2

Я думаю, что эта функция уже существует и называется «если». Как 'if (k == 0) {do sth. } '. – migg

+0

Кажется, вы ищете какой-то механизм наблюдения при изменении значения переменной. В JS такой вещи нет. –

+0

@migg «if» оценивает условие один раз и отбрасывает его. Я думаю о чем-то, что работает вечно и всегда оценивает. – Amit

ответ

1

Что будет работать с лямбда как для условия, так и для действия. Используя выражения функции стрелки (спасибо @Kyll), он даже достаточно компактен.

when (() => k == 0,() => { do something; }); 
+0

Будет выглядеть лучше со стрелкой! 'when (() => condition, action)' –

+0

My JS-fu в лучшем случае ржавый. Просто добавил ответ, потому что это выглядело так, как будто моего комментария было достаточно для OP. Сначала нужно было посмотреть, но ни один из других комментариев/ответов не использовал ничего, кроме функциональных выражений. Изменит ответ. – Zastai

3

что-то вроде этого?

function when(condition, callback){ if (condition) callback() } 

и назвать его как

var a = 0; 
when(a == 0, function(){ console.log("yeyyyy") }); 

после прочтения комментариев выше

какой-то механизм для наблюдения, когда значение переменной изменяется

изменения when метод

function when(lhs, operator, rhs, callback) 
{ 
    var result = false; 
    switch(operator) 
    { 
     case "==": result = (lhs==rhs); break; 
     case "===": result = (lhs===rhs); break; 
     case "<": result = (lhs<rhs); break; 
     case ">": result = (lhs>rhs); break; 
     case "<=": result = (lhs<=rhs); break; 
     case ">=": result = (lhs>=rhs); break; 
     default: result = true; 
    } 
    if (result) { callback() } 
    else { setTimeout(function(){ when(lhs, operator, rhs, callback) }, 1000); } 
} 
+0

Не совсем ... когда вы отправляете функцию == 0, в этом случае она отправляет «true». Я хочу отправить фактическое состояние, если это возможно, и затем оценить его внутри функции. «когда» - это функция с таймаутом в 1 миллисекунду, и каждые 1 миллисекунда проверяет, есть ли == 0. если это правда, теперь он запустит функцию обратного вызова и остановит таймаут. – Amit

+0

@После чтения ваших комментариев выше, я думаю, вам нужно будет построить выражение в самом методе. Для этого вам нужно будет передать все три, чтобы (lhs, rhs и operator). Проверьте обновленный код сейчас. – gurvinder372

Смежные вопросы