返回函数 Chrome 开发工具

Returning a function Chrome Dev tools

这个问题可能在其他地方有答案,但我什至不确定如何开始寻找答案。我是 JavaScript 的新手,所以我很难理解这个。

给定以下代码:

function multiple(n) {
    function f(x) {
        return x * n;
    }
    return f;
}
var triple = multiple(3);
var quadruple = multiple(4);

当我将以下内容传递到控制台时:

console.log(triple(5));

我得到了我期望的结果,即 15。同样,对于任何数字,它都会变成三倍(如果我使用第二个函数,它会变成四倍)。

但是当我在控制台中输入 triple 时,我得到以下代码:

f(x) {
    return x * n;
}

控制台不应该return...

f(x) {
    return x * 3;
}

...因为3是凭借下面的代码编码到函数中的:

var triple = multiple(3);

好吧,如果你有:

  var n = 3;
  function f(x) {
     return n * x;
  }

如果你记录 f 你会看到上面的函数,但是当你调用它时 n 将从范围链中名为 n 的最近变量获取它的值,在我们的案例 n = 3,在全局范围内声明的 n 的值。

我不知道 JS 引擎在那个闭包中存储 n 变量的确切方式(在你的例子中是由 multiple 函数创建的闭包),但重要的是闭包中的变量是由 reference 而不是按值保存的。

键入 triple 只会显示函数的 源代码

since 3 is coded into the function by virtue of the following code

这是一个错误的说法。您没有更改函数的源代码。要更改源代码,您必须重新定义整个函数。您所做的只是传递一个参数。控制台为您提供正确的输出。

当你将一个参数传递给一个函数时,在高层次上,在运行时它只是在寻找存储在该变量(或类似的东西)的内存地址中的任何值。但是并不是重写函数的源代码。

3 不是 硬编码到函数中。 f 的代码引用变量 n,而不是数字 3。在您的代码中,碰巧没有办法修改 n,但想象一下某些代码 一种修改 n:[=21 的方法=]

function multiple(n) {
    function f(x) {
        return x * n;
    }
    function modifyN(newN) {
        n = newN;
    }
    return { f: f, modifyN: modifyN };
}
var resultFor3 = multiple(3);
var triple = resultFor3.f;
var modifyTripleN = resultFor3.modifyN;

如您所见,n 不是硬编码的;它与任何其他变量没有什么不同。在您的特定示例中,无法在 multiple 终止后修改 n,但这不会使调用 multiple 创建的闭包内部的值以任何方式 "hard-coded".