Порядок вычисления javascript

#javascript

#javascript

Вопрос:

Мне поручено написать функцию f на javascript, и

 f(0) f(1)//should return 0 if evaluated from left to right
         //should return 1 if evaluated from right to left
  

Как я могу реализовать функцию f? Я думаю о том, чтобы отслеживать, вызывается ли f раньше, но понятия не имею, как это сделать.

Решение схемы выглядит следующим образом:

(определить f (пусть ((установить #f)) (определить (fn n) (если установлено 0 (начать (установить! установить #t) n))) fn))

Комментарии:

1. Используйте переменную где-нибудь за пределами функции.

2. f(0) будет выполняться f(1) всегда раньше. Он никогда не будет оцениваться «справа налево».

3. Для чего вы ожидаете получить результат f(0) f(1) f(2) при вычислении слева направо?

4. @user122049 Если у вас есть решение, даже если в схеме, пожалуйста, опубликуйте его.

5. function f(x) { f = function() { return x }; return 0 } это лишь одна из многих возможностей. Но нет, вы не можете обойтись чистыми функциями (без внешнего состояния).

Ответ №1:

Решение схемы, похоже, сводится к

 var f = (function() {
    var set = false;
    function fn(n) {
        if (set) {
            return 0;
        } else {
            set = true;
            return n;
        }
    }
    return fn;
}());
  

это немного скучно, но ожидаемо. Да, вам нужно отслеживать состояние где-то за пределами f , объявление дополнительной переменной — самое простое решение. Однако он не обязательно должен быть глобальным, set он скрыт в области IIFE.

Комментарии:

1. @user122049 Вы должны переопределить f после его повторного вызова. set работает только для двух вызовов.

Ответ №2:

Решение со свойством функции.

 function f(v) {
    return [f.value || 0, f.value = v][0];
}

console.log(f(0)   f(1)); // 0  

 function f(v) {
    return [f.value || 0, f.value = v][0];
}

console.log(f(1)   f(0)); // 1  

Ответ №3:

Я уверен, что есть более короткая версия…

 function f(arg) {
    if (!f.called amp;amp; arg === 0) {
        f.called = true;
        return 0;
    } else if (f.called amp;amp; arg === 1) {
        return 1;
    }

    return 0;
}
  

Комментарии:

1. Извините, но не могу объявить что-либо вне функции f .

2. @user122049 Но в вашем вопросе об этом не говорится? В любом случае, я просто добавил это для ясности, чтобы помочь вам понять. Нет необходимости в чем-либо вне функции — см. Отредактированную версию.