微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在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 变量的工作原理。从长远来看,我认为您可能会从研究函数式编程概念和不可变变量的使用中受益。

但是,可以通过将函数封装在对象方法中来创建类似于您所描述的内容,特别是 valueOftoString 方法,它们在 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 举报,一经查实,本站将立刻删除。