如何在javascript中使一个变量成为另一个变量的数学函数

如何在javascript中使一个变量成为另一个变量的数学函数,javascript,javascript-objects,Javascript,Javascript Objects,我指的是标题中数学意义上的问题。给定一个变量x和y,它们可以通过方程y=fx联系起来,其中f是一些数学函数。这意味着当x=2,y=f2,当x=-5,y=f-5,依此类推。这在数学环境中是很自然的事情,我希望有一种简单的方法可以在javascript中实现这种行为。为了具体起见,让我们想象函数fx=2x。我们可以通过以下方式在代码中实现这一点: function f(x){ return 2*x } 但以下行为是默认行为 x=3 y=f(x) y // returns 6 x=4 y /

我指的是标题中数学意义上的问题。给定一个变量x和y,它们可以通过方程y=fx联系起来,其中f是一些数学函数。这意味着当x=2,y=f2,当x=-5,y=f-5,依此类推。这在数学环境中是很自然的事情,我希望有一种简单的方法可以在javascript中实现这种行为。为了具体起见,让我们想象函数fx=2x。我们可以通过以下方式在代码中实现这一点:

function f(x){
    return 2*x
}
但以下行为是默认行为

x=3
y=f(x)
y // returns 6
x=4
y // still returns 6
尽管我们最初写的是y=fx,但随着x的变化,这种关系不会持续

我想这个问题的一个更简单的版本是当f只是恒等函数,我们使用y=x。你可以写y=x,改变x,y仍然是x的旧值,这取决于x是否持有原语或参考值,以及我们如何改变x的值

似乎为了复制一个值,使关系y=x保持不变,我们必须1通过引用复制它,2更改值,例如通过point.xCoord=6,以避免混淆引用信息。我想知道是否有这样一种解决方案,它通常适用于y=fx,而不是仅适用于y=x


我现在使用的解决方法是将x存储在一个对象中,该对象还跟踪依赖于它的值,并且只通过调用方法来更新x,该方法也会更新依赖于x的每个值。这感觉像是一个丑陋的解决方案,所以我想知道是否有更好的方法。

我无法在您的代码中找到错误,但我将尝试重写它

函数fx{ 返回x*2; } var x=2; var y=外汇; 精神病学; x=3; y=fx; 精神病学;
//如果要存储输出,则y=f2;或者y=f3我无法在您的代码中找到错误,但我将尝试重写它

函数fx{ 返回x*2; } var x=2; var y=外汇; 精神病学; x=3; y=fx; 精神病学;
//如果要存储输出,则y=f2;或者y=f3您要问的不是JavaScript变量的工作方式。从长远来看,我认为您可能会从函数式编程概念和不可变变量的使用中受益

但是,通过将函数封装在对象方法中,特别是valueOf和toString方法,可以创建类似于您所描述的内容,这些方法在JavaScript中具有特殊含义

例如:

const track=f=>{valueOf:f,toString:=>f.toString}; 设x=7; 设y=8; 常数z=轨迹=>x*x+2*y; //使用z进一步导出一个值 常数a=轨迹=>z-x; log`***x=${x},y=${y}***`; console.log'z=',z.valueOf; //如果使用变量,则会隐式计算valueOf //在数学表达式中 console.log'z*2=',z*2; console.log'a=',a*1; //强制为字符串值 log`z=${z},a=${a}`; //改变x x=5; log`***x=${x},y=${y}***`; console.log'z*2=',z*2; console.log'a=',a*1; //变y y=50; log`***x=${x},y=${y}***`; console.log'z*2=',z*2; console.log'a=',a*1; //使用valueOf比较 常数=l,r=>l.valueOf==r.valueOf; 控制台。日志'equalsa,120',equalsa,120;
控制台.日志'equalsa,125',equalsa,125 你要问的不是JavaScript变量是如何工作的。从长远来看,我认为您可能会从函数式编程概念和不可变变量的使用中受益

但是,通过将函数封装在对象方法中,特别是valueOf和toString方法,可以创建类似于您所描述的内容,这些方法在JavaScript中具有特殊含义

例如:

const track=f=>{valueOf:f,toString:=>f.toString}; 设x=7; 设y=8; 常数z=轨迹=>x*x+2*y; //使用z进一步导出一个值 常数a=轨迹=>z-x; log`***x=${x},y=${y}***`; console.log'z=',z.valueOf; //如果使用变量,则会隐式计算valueOf //在数学表达式中 console.log'z*2=',z*2; console.log'a=',a*1; //强制为字符串值 log`z=${z},a=${a}`; //改变x x=5; log`***x=${x},y=${y}***`; console.log'z*2=',z*2; console.log'a=',a*1; //变y y=50; log`***x=${x},y=${y}***`; console.log'z*2=',z*2; console.log'a=',a*1; //使用valueOf比较 常数=l,r=>l.valueOf==r.valueOf; 控制台。日志'equalsa,120',equalsa,120; 控制台.日志'equalsa,125',equalsa,125 更新:这对你的处境有帮助吗

样本:

功能模型{ this.varX=ko.1; this.varY=ko.computed函数{ 返回这个.varX; }这,; } var模型=新模型; 设置间隔函数{ model.varXmodel.varX+1; console.logx更新为model.varX; console.logic值,model.varY; }, 1000; 更新:这对你的处境有帮助吗

样本:

功能模型{ this.varX=ko.1; this.varY=ko.computed函数{ 返回这个.varX; }这,; } var模型=新模型; 设置间隔函数{ model.varXmodel.varX+1; console.logx更新为model.varX; console.logic值,model.varY; }, 1000; JavaScript!==数学 句号

JavaScript是一种有点疯狂的灵活语言,所以技术上有一种方法可以做到这一点

但是拜托,JS不是数学。如果您的任何开发伙伴看到您提出的疯狂解决方案,在再次与您合作之前,他们会三思而后行

那么,该怎么办

如注释中所述,只需将函数存储在y中

您无法使用它定义其他函数的原因根本不存在

//...

//               vv--- call it, as always
const z = () => y() + 1

console.log(x, y(), z()) //z() === 5!
试试看:

const f=x=>2*x//这是'f'的另一种声明,其作用相同 //vv——没有参数,这将使用外部的x。 常数y==>fx //^^^--const,因为我们不希望y本身发生变化,而只希望y返回的值发生变化 设x=3 //叫它vv console.log'x=',x'y=',y//y==6,很好! x=2 console.log'x=',x',y=',y//y==4! //像往常一样,叫它 常数z==>y+1 console.log'x=',x',y=',y',z=',z//z==5! x=42 console.log'x=',x'y=',y'z=',z//x=42,y=84,z=85JavaScript!==数学 句号

JavaScript是一种有点疯狂的灵活语言,所以技术上有一种方法可以做到这一点

但是拜托,JS不是数学。如果您的任何开发伙伴看到您提出的疯狂解决方案,在再次与您合作之前,他们会三思而后行

那么,该怎么办

如注释中所述,只需将函数存储在y中

您无法使用它定义其他函数的原因根本不存在

//...

//               vv--- call it, as always
const z = () => y() + 1

console.log(x, y(), z()) //z() === 5!
试试看:

const f=x=>2*x//这是'f'的另一种声明,其作用相同 //vv——没有参数,这将使用外部的x。 常数y==>fx //^^^--const,因为我们不希望y本身发生变化,而只希望y返回的值发生变化 设x=3 //叫它vv console.log'x=',x'y=',y//y==6,很好! x=2 console.log'x=',x',y=',y//y==4! //像往常一样,叫它 常数z==>y+1 console.log'x=',x',y=',y',z=',z//z==5! x=42
log'x=',x'y=',y'z=',z//x=42,y=84,z=85我想我明白你的意思了,但是如果每次调用y时都希望y用x的最新值重新计算fx,那么y本身不是函数是没有意义的。y==>fx将执行您想要的操作。y//6x=4;y//8@chiliNUT该解决方案的唯一问题是,当您想要使用函数take z=y+1执行具体的值操作时。如果y==>fx,那么必须以某种方式重写+才能在实值函数上定义。现在激励我的例子是可视化向量列表,其中一些是列表中其他向量的函数,例如x=crossProductv,w。这看起来很自然,所以也许这更容易理解,但我需要更多地思考。在js中,引用变量并期望它重新计算函数是可能的,但不是标准或预期的行为。我建议你去看看math.js这样的数学库,我过去用过它,它很棒,它让你可以使用类似于ti89语法的语法,这是我个人最熟悉的CAS。我想我明白你的意思了,但是如果每次调用y时都希望y用x的最新值重新计算fx,那么y本身不是一个函数就没有意义了。y==>fx将执行您想要的操作。y//6x=4;y//8@chiliNUT该解决方案的唯一问题是,当您想要使用函数take z=y+1执行具体的值操作时。如果y==>fx,那么必须以某种方式重写+才能在实值函数上定义。现在激励我的例子是可视化向量列表,其中一些是列表中其他向量的函数,例如x=crossProductv,w。这看起来很自然,所以也许这更容易理解,但我需要更多地思考。在js中,引用变量并期望它重新计算函数是可能的,但不是标准或预期的行为。我建议查看math.js之类的数学库,我过去使用过它,它非常棒,它允许您使用类似于ti89语法的语法,这是我个人最熟悉的CA。请注意===不适用于此,并且在使用该值时,您始终必须将其强制为某些内容。但这是一个完全正确和非常丑陋的解决方案@FZs是真的,但是如果你要做这样的事情,你可以使用一个相等函数来比较valueOf:const equals=a,b=>a.valueOf==b.valueOf;请注意,===无法使用该值,并且在使用该值时,必须始终将其强制为某个值。但这是一个完全正确和完美的例子
丑陋的解决方案@FZs是真的,但是如果你要做这样的事情,你可以使用一个相等函数来比较valueOf:const equals=a,b=>a.valueOf==b.valueOf;OP希望y在任何时候更改x,而不显式重新分配y。OP希望y在任何时候更改x,而不显式重新分配y。