javascript,一个变量可以是一个值,也是一个函数吗?
javascript, can a variable be a value and also a function?
可以像下面这样在 javascript 中编码:
var foo = function(n) { //magic codes };
var bar = foo(2);
bar + 2 // result: 4
bar(2) // result: 4
bar(2)(2) // result: 6
柯里化可以在 Javascript 中通过返回一个函数来完成。
默认情况下,变量可以是值(文字或函数的结果)或函数声明。
function add(number) {
return function(number2) {
return number + number2;
}
}
console.log(add(5)(6));
有一些方法可以实现您所描述的 bar + 2
,但这是非常规的,在我看来,您不应该在 Javascript 中使用它们。
一个变量只能保存一个值。该值可以是一个函数。
一个对象可以有一个 toString()
方法,它可以被黑客攻击以接近你想要做的事情。
function myFactory(value) {
function myFunction(add) {
return myFactory(value + add);
}
myFunction.toString = function() {
return value;
};
return myFunction;
}
var bar = myFactory(2);
console.log(bar + 2);
console.log(bar(2));
console.log(bar(2)(2));
这当然很可怕。
我从 Quetin 的回答中得到启发,找到了 valueOf 属性
var foo = function(n) {
var fn = function(x) {
return foo(n + x);
};
fn.valueOf = function() {
return n;
};
return fn;
}
var bar = foo(2);
console.log(bar + 2 === 4, bar);
console.log(bar(2) === 4, bar(2));
console.log(bar(2)(2) === 6, bar(2)(2));
我承认日志结果确实很奇怪,但它按预期工作。
可以像下面这样在 javascript 中编码:
var foo = function(n) { //magic codes };
var bar = foo(2);
bar + 2 // result: 4
bar(2) // result: 4
bar(2)(2) // result: 6
柯里化可以在 Javascript 中通过返回一个函数来完成。 默认情况下,变量可以是值(文字或函数的结果)或函数声明。
function add(number) {
return function(number2) {
return number + number2;
}
}
console.log(add(5)(6));
有一些方法可以实现您所描述的 bar + 2
,但这是非常规的,在我看来,您不应该在 Javascript 中使用它们。
一个变量只能保存一个值。该值可以是一个函数。
一个对象可以有一个 toString()
方法,它可以被黑客攻击以接近你想要做的事情。
function myFactory(value) {
function myFunction(add) {
return myFactory(value + add);
}
myFunction.toString = function() {
return value;
};
return myFunction;
}
var bar = myFactory(2);
console.log(bar + 2);
console.log(bar(2));
console.log(bar(2)(2));
这当然很可怕。
我从 Quetin 的回答中得到启发,找到了 valueOf 属性
var foo = function(n) {
var fn = function(x) {
return foo(n + x);
};
fn.valueOf = function() {
return n;
};
return fn;
}
var bar = foo(2);
console.log(bar + 2 === 4, bar);
console.log(bar(2) === 4, bar(2));
console.log(bar(2)(2) === 6, bar(2)(2));
我承认日志结果确实很奇怪,但它按预期工作。