如何使用JavaScript';什么是嵌套函数?
我是JavaScript世界的新手。今天在使用JavaScript时,我发现了以下代码片段:如何使用JavaScript';什么是嵌套函数?,javascript,Javascript,我是JavaScript世界的新手。今天在使用JavaScript时,我发现了以下代码片段: function sum (a) { var sum = a; function f (b) { sum += b; return f; } f.toString = function () { return sum; } return f } //Calling the function co
function sum (a) {
var sum = a;
function f (b) {
sum += b;
return f;
}
f.toString = function () {
return sum;
}
return f
}
//Calling the function
console.log(sum(4)(5));
你能帮我理解什么时候执行
f.toString
吗?当你把一个对象传递到console.log()
时,它调用.toString()
以打印出值
因此,
返回一个函数。对该函数的后续调用
sum(4)(5)
还返回一个函数。然后将其传递到console.log()
,控制台中的结果为
9
应该注意的是,console
API是一个非常不稳定的准标准,因为它是作为调试辅助工具设计的,所以有些行为可能会让人困惑。然而,在这种情况下,它似乎只是简单地调用.toString()
,而没有任何其他“有用的”有趣的业务。但是,如果您只是将一个简单的空对象传递给console.log()
,如下所示
console.log({})
您可以(至少从Firefox中的Firebug)获得一个有用的界面来导航对象。如果您正在调试某些东西,这很好,但是如果您试图了解该语言是如何工作的,那么这种行为可能会令人困惑
最后,可以扩展发布代码中的技巧,以便通过添加.valueOf()
方法,该函数也可以泄露数值结果:
function sum (a) {
var sum = a;
function f (b) {
sum += b;
return f;
}
f.toString = function () {
return sum;
};
f.valueOf = function() {
return sum;
};
return f;
}
如果你这样做了,那么你会得到正确的答案
console.log(2 * sum(4)(5))
执行sum(4)(5)
时,首先执行sum(4)
,返回函数f
此函数可以访问变量sum
(由于JavaScript函数[1]的闭包属性)。此函数进行求和并再次返回函数f
这次console.log
试图打印函数f
,因此我们通过定义f.toString
打印总和来明确定义函数的打印方式
编辑:如果您想知道为什么要花这么多时间简单地添加两个数字,请尝试以下方法:
add(2)(1)(45)(22)
这是因为现在递归调用了f
,并且更新了sum
,这也是由于闭包属性
1:即使父函数已超出范围,内部函数也可以访问父函数的变量。此处:
console.log(sum(4)(5))代码>console.log
调用函数上的toString
方法,至少在Chrome中是这样。在您的示例中,code f.toString()是一个永远不会执行的函数。旁注:由于您是JavaScript新手,所以始终使用分号(;
)结束语句行。它使代码不那么模棱两可。@surajckconsole.log()
将调用.toString()
。@Pointy请详细说明。如果是这样,console.log({})
将打印“[object object]”
@FelixKling no,因为返回的函数被显式地赋予了.toString()
发布代码中的方法。编辑哦对不起;正如我在对答案的修正中所指出的,你不能相信console.log()
去做一些简单的事情。我的观点是,它不是简单地对每个对象/值调用toString
。它以不同的方式对待不同的值“类型”。@FelixKling是的,对不起;我同意,我更新了答案,指出预测console.log()
将要做的事情可能很棘手。我想指出,这也是控制台的浏览器依赖行为。IE 11返回[object object]
,其中Chrome返回9
add(2)(1)(45)(22)