如何使用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

我是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
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新手,所以始终使用分号(
)结束语句行。它使代码不那么模棱两可。@surajck
console.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)