返回函数Chrome开发工具

Returning a function Chrome Dev tools

本文关键字:开发工具 Chrome 函数 返回      更新时间:2023-09-26

这个问题可能在其他地方得到答案,但我甚至不知道如何开始寻找答案。我是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。同样,对于任何数字,它都会增加三倍(如果我使用第二个函数,则会增加四倍)。

但当我在控制台中键入三重时,我会得到以下代码:

f(x) {
    return x * n;
}

控制台不应该返回吗。。。

f(x) {
    return x * 3;
}

由于3是通过以下代码编码到函数中的:

var triple = multiple(3);

3不是硬编码到函数中。f的代码指的是变量n,而不是数字3。在你的代码中,碰巧没有办法修改n,但想象一下一些代码中修改n:的方法

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创建的闭包内的值以任何方式"硬编码"。

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

由于3是通过以下代码编码到函数中的

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

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

好吧,这和如果你有的话是一样的

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

如果您记录f,您将看到上面的函数,但当您调用它时,n将从作用域链中最接近的变量n获得其值,在我们的例子中是n = 3,即全局作用域中声明的n的值。

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