如何使用JavaScript'的嵌套函数起作用

How do JavaScript's nested functions work?

本文关键字:嵌套 函数 起作用 何使用 JavaScript      更新时间:2023-09-26

我是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)

返回一个函数。对该函数的后续调用

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:即使在父函数超出范围后,内部函数也可以访问父函数的变量。