JavaScript 函数计算器
JavaScript Function Calculator
我到目前为止:
function func(f,x) {
alert(f(x));
}
func(function(x) {return x*x;},2);
这行得通,但我认为传递 function(x) {return x*x;},
是多余的,我可以传递 x*x
,因为我的想法是我可以提供(几乎)任何功能。
我试过:
function func(f,y) {
g=function() {return f;};
alert(g(y));
}
func(x*x,2);
等等,但我无法让它工作。也许如果我将 'x*x' 作为字符串传递..?
好吧,我有办法使用 eval
这里 http://jsfiddle.net/q5ayoszy/
function func(f,y) {
g=function()
{ x=y;
return eval(f);
};
alert(g(y));
}
func('x*x',2);
注意:我将表达式作为字符串传递,然后在函数内部使用它。
您只需将 y
的值赋给函数内的变量 x
,这样 eval
就可以正确计算
用字符串做到这一点的唯一方法是使用臭名昭著的 eval
:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
var x = 2;
var y = eval("x * x"); //y = 4
但是使用 eval 几乎总是一个非常糟糕的主意。
你说的语法过多是正确的,但对于 ES5 及之前的版本,就是这样。
但是,在 ES6 中,您可以使用新的 "arrow function" lambda 语法:
func(x => x * x, 2);
见http://www.es6fiddle.net/i4o5uj2l/
FWIW,上面的 func
不是很好,因为它只支持 unary 函数,即那些采用单个参数的函数。您可以扩展 func
以使用 ES6 "spread arguments":
function func(f, ...args) {
console.log(f.apply(this, args));
}
func((x, y) => x * y, 3, 7);
> 21
您可以使用柯里化将过程分解为更小的函数:
function multiply(x) {
return function() {
return x*x;
}
}
var bytwo = multiply(2);
bytwo(); // 4
我到目前为止:
function func(f,x) {
alert(f(x));
}
func(function(x) {return x*x;},2);
这行得通,但我认为传递 function(x) {return x*x;},
是多余的,我可以传递 x*x
,因为我的想法是我可以提供(几乎)任何功能。
我试过:
function func(f,y) {
g=function() {return f;};
alert(g(y));
}
func(x*x,2);
等等,但我无法让它工作。也许如果我将 'x*x' 作为字符串传递..?
好吧,我有办法使用 eval
这里 http://jsfiddle.net/q5ayoszy/
function func(f,y) {
g=function()
{ x=y;
return eval(f);
};
alert(g(y));
}
func('x*x',2);
注意:我将表达式作为字符串传递,然后在函数内部使用它。
您只需将 y
的值赋给函数内的变量 x
,这样 eval
就可以正确计算
用字符串做到这一点的唯一方法是使用臭名昭著的 eval
:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
var x = 2;
var y = eval("x * x"); //y = 4
但是使用 eval 几乎总是一个非常糟糕的主意。
你说的语法过多是正确的,但对于 ES5 及之前的版本,就是这样。
但是,在 ES6 中,您可以使用新的 "arrow function" lambda 语法:
func(x => x * x, 2);
见http://www.es6fiddle.net/i4o5uj2l/
FWIW,上面的 func
不是很好,因为它只支持 unary 函数,即那些采用单个参数的函数。您可以扩展 func
以使用 ES6 "spread arguments":
function func(f, ...args) {
console.log(f.apply(this, args));
}
func((x, y) => x * y, 3, 7);
> 21
您可以使用柯里化将过程分解为更小的函数:
function multiply(x) {
return function() {
return x*x;
}
}
var bytwo = multiply(2);
bytwo(); // 4