Javascript 计算顺序

Javascript 计算顺序,javascript,Javascript,我的任务是用javascript编写一个函数f 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) (let((set#f)) (定义(fn) (如已设置) 0 (开始(设定!设定) n) )) fn))我肯定有一个

我的任务是用javascript编写一个函数f

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) (let((set#f)) (定义(fn) (如已设置) 0 (开始(设定!设定) n) ))
fn))

我肯定有一个较短的版本

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

    return 0;
}

我相信有一个较短的版本

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

    return 0;
}

该方案的解决方案似乎归结为

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

这有点无聊,但却是意料之中的事。是的,您需要跟踪
f
之外的某个地方的状态,声明一个额外变量是最简单的解决方案。不过,它不需要是全局的,
set
隐藏在IIFE的范围内。

方案解决方案似乎归结为

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

这有点无聊,但却是意料之中的事。是的,您需要跟踪
f
之外的某个地方的状态,声明一个额外变量是最简单的解决方案。但是它不需要是全局的,
set
隐藏在IIFE的范围内。

具有函数属性的解决方案

函数f(v){
返回[f.value | | 0,f.value=v][0];
}

console.log(f(0)+f(1));//0具有函数属性的解决方案

函数f(v){
返回[f.value | | 0,f.value=v][0];
}

console.log(f(0)+f(1));//0
在函数之外的某个地方使用变量。
f(0)
将始终在
f(1)
之前运行。它永远不会“从右到左”计算。当从左到右计算时,你认为
f(0)+f(1)+f(2)
的结果会是什么?@user122049如果你有一个解决方案,即使在Scheme中,也请发布它。
function f(x){f=function(){return x};return 0}
只是众多可能性之一。但是,不能使用纯函数(没有外部状态)。请在函数之外的某个位置使用变量。
f(0)
将始终在
f(1)
之前运行。它永远不会“从右到左”计算。当从左到右计算时,你认为
f(0)+f(1)+f(2)
的结果会是什么?@user122049如果你有一个解决方案,即使在Scheme中,也请发布它。
function f(x){f=function(){return x};return 0}
只是众多可能性之一。但是不,你不能使用纯函数(没有外部状态)。对不起,不能声明函数f之外的任何东西。@user122049,但你的问题没有这么说?不管怎样,我只是为了清楚起见添加了它,以帮助您理解。不需要函数之外的任何内容-请参阅编辑的版本。抱歉,无法声明函数f之外的任何内容。@user122049但您的问题没有说明这一点?不管怎样,我只是为了清楚起见添加了它,以帮助您理解。不需要函数之外的任何内容-请参阅编辑的版本。@user122049调用两次后,必须重新定义
f
set
仅对两个调用有效。@user122049在调用两次后,必须重新定义
f
<代码>设置
仅适用于两次呼叫。