如何解决如何在javascript中使一个变量成为另一个变量的数学函数
我指的是数学意义上的标题中的问题。给定变量 x 和 y,它们可以通过方程 y=f(x) 相关联,其中 f 是某个数学函数。这意味着当 x=2 时,y=f(2),当 x=-5 时,y=f(-5),依此类推。在数学环境中,这是一件很自然的事情,我希望有一种简单的方法可以在 javascript 中实现这种行为。为了具体起见,让我们想象一下函数 f(x)=2x。我们可以通过
在代码中实现这一点function f(x){
return 2*x
}
但以下行为是默认的
x=3
y=f(x)
y // returns 6
x=4
y // still returns 6
即使我们最初写的是 y=f(x) 这个关系也不会随着 x 的变化而持续存在。
我想这个问题的一个更简单的版本是当 f 只是恒等函数并且我们使用 y=x 时。你可以写 y=x,改变 x,而 y 仍然是 x 的旧值,这取决于 x 是否持有原始值或参考值以及我们如何改变 x 的值。
似乎为了复制一个值以使关系 y=x 保持不变,我们必须(1)通过引用复制它并且(2)更改值,例如通过 point.xCoord = 6 以免弄乱参考信息。我想知道是否有这样的解决方案,通常适用于 y=f(x) 而不仅仅是 y=x。
我现在使用的解决方法是将 x 存储在一个对象中,该对象还跟踪依赖于它的值,并且仅通过调用也更新依赖于 x 的每个值的方法来更新 x。这感觉像是一个丑陋的解决方案,所以我想知道是否有更好的方法。
解决方法
您要问的不是 JavaScript 变量的工作原理。从长远来看,我认为您可能会从研究函数式编程概念和不可变变量的使用中受益。
但是,可以通过将函数封装在对象方法中来创建类似于您所描述的内容,特别是 valueOf
和 toString
方法,它们在 JavaScript 中具有特殊含义。
例如:
const track = (f) => ({ valueOf: f,toString: () => f().toString() });
let x = 7;
let y = 8;
const z = track(() => x * x + 2 * y);
// further derive a value using z
const a = track(() => z - x);
console.log(`*** x = ${x},y = ${y} ***`);
console.log('z =',z.valueOf());
// valueOf() is implicitly evaluated if the variable is used
// in a mathematical expression
console.log('z * 2 =',z * 2);
console.log('a =',a * 1);
// coerce to a string value
console.log(`z = ${z},a = ${a}`);
// change x
x = 5;
console.log(`*** x = ${x},y = ${y} ***`);
console.log('z * 2 =',a * 1);
// change y
y = 50;
console.log(`*** x = ${x},a * 1);
// compare using valueOf()
const equals = (l,r) => l.valueOf() === r.valueOf();
console.log('equals(a,120)',equals(a,120));
console.log('equals(a,125)',125));
更新:这answer对您的情况有帮助吗?
示例:
function Model() {
this.varX = ko.observable(1);
this.varY = ko.computed(function() {
return this.varX();
},this);
}
var model = new Model();
setInterval(function() {
model.varX(model.varX() + 1);
console.log("x is updated ",model.varX());
console.log("y value ",model.varY());
},1000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
JavaScript !== Math
。
期间。
JavaScript 有点疯狂灵活语言,所以技术上有办法做到这一点。
但是来吧——JS 不是数学。如果您的任何开发人员同行看到您提出的疯狂解决办法,他们会在再次与您合作之前考虑两次。
那么,该怎么办?
如评论中所述,只需将函数存储在 y
中。
const f = x => 2*x //This is an alternative declaration of `f`,that does the same
// vv--- no arguments,this will use the x from the outside.
const y = () => f(x)
//^^^--- const,because we won't expect y itself to change,but rather just the value returned by it
let x = 3
// call it ---vv
console.log(x,y()) //y() === 6,fine!
x = 2
console.log(x,y()) //y() === 4!
你不能用它来定义其他函数的原因根本不存在!
//...
// vv--- call it,as always
const z = () => y() + 1
console.log(x,y(),z()) //z() === 5!
试试看:
const f = x => 2*x //This is an alternative declaration of `f`,but rather just the value returned by it
let x = 3
// call it ---vv
console.log('x =',x,'y =',fine!
x = 2
console.log('x =',y()) //y() === 4!
// vv--- call it,as always
const z = () => y() + 1
console.log('x =','z =',z()) //z() === 5!
x = 42
console.log('x =',z()) //x = 42,y = 84,z = 85
我无法在您的代码中找到错误,但我会尝试重写它
function f(x) {
return (x*2);
}
var x = 2;
var y = f(x);
console.log(y);
x = 3;
y = f(x);
console.log(y);
//If you want to store the output then,y = f(2); or y = f(3)
尝试运行上面的代码片段。它对我有用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。