我刚开始学习javascript并遇到一项我不理解的任务。任何人都可以解释我为什么要返回功能名称"返回f"在这个例子中,我们使用了什么" f.toString"?
function sum(a) {
var currentSum = a;
function f(b) {
currentSum += b;
return f;
}
f.toString = function() {
return currentSum;
};
return f;
}
alert( sum(1)(2) ); // 3
alert( sum(5)(-1)(2) ); // 6
alert( sum(6)(-1)(-2)(-3) ); // 0
alert( sum(0)(1)(2)(3)(4)(5) ); // 15
答案 0 :(得分:1)
让我们从简化版开始:
function sum(currentSum) {
return function f(b) {
currentSum += b;
return f;
}
}
它会像你的一样,你可以这样做:
sum(1)(2)(3);//f
sum(1)(2);//f
但是,它们总是返回一个函数,因此无法访问 currentSum 。它总和范围并且由于它永远不会返回或通过,因此无法获得它。所以我们可能需要另一个函数来调用以获得当前的总和:
function sum(currentSum) {
function f(b) {
currentSum += b;
return f;
}
f.getSum = function() {
return currentSum;
};
return f;
}
所以现在 f 有一个属性(函数也是对象),这是一个名为 getSum 的函数来获取变量
sum(1)(2)(3)//f
sum(1)(2)(3).getSum()//6 <= wohhooo
但为什么我们称之为 toString ?
将变量添加到字符串时,会将其转换为字符串,例如
1+"one"//"1one"
同样适用于对象/函数,但在这种情况下,js解析器首先尝试调用它们的 toString 方法,因此:
sum(1)(2)+"three"
等于
sum(1)(2).toString()+"three"
将非字符串传递给警报时会发生相同的转换。
答案 1 :(得分:0)
您正在返回该对象。所以你可以再次调用该函数,在第二次调用中,你将拥有一个currentSum。
当你总和(3)时,该函数将保持数字3,当你再次调用它时,执行sum(3)(4)它会将4添加到currentSum。
然后警报将调用toString方法,它将打印总和
答案 2 :(得分:0)
看一下第一个例子
alert( sum(1)(2) ); // 3
sum(1) // will return f. sum must return a function in order for the syntax to work
它将返回f后将变为:
alert( f(2) );
答案 3 :(得分:0)
这是理解JavaScript类型系统的任务。任务是使用currying创建添加数字的功能。当您在任务中编写时,我们的想法是创建在调用sum(1)(2)(3)
时添加数字的函数。
我们在函数sum
中做了什么(查看代码):
1
var currentSum = a;
这里你在函数sum
范围内声明一个sum变量。
function f(b){ currentSum + = b; 返回f; }
然后声明将执行求和的函数。它返回自己做这种事情的可能性:f(1)(2)(3)
3
f.toString = function() {
return currentSum;
};
之后,您声明f,转换为字符串返回总和值
与f.toString相比 - 当f被传递alert
作为参数时,它被调用。这是javascript的自动转换
答案 4 :(得分:0)
使用函数sum
,您传递第一个参数a
并返回函数f
,其中currentSum
与传递给f
的参数b
并且再次返回f
并且你可以在你想要的时候做很多次它会调用alert
函数,它需要它的第一个参数是字符串。为此,您已在函数f
toString
上重写了该方法,在这种情况下将返回currentSum
。
每个对象都有一个toString()方法,当该对象表示为文本值时会自动调用该方法。