返回一个函数 Chrome Dev 工具

6

这个问题可能有其他地方的答案,但我甚至不知道如何开始搜索答案。我是 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;
}

控制台不应该返回“未定义”而是一个错误消息吗?

f(x) {
    return x * 3;
}

由于以下代码的存在,3已经被编入该函数:

var triple = multiple(3);

5
你自己已经回答了你的问题,3并没有被“编码进”函数f中,而是通过参数传递给它。控制台只是显示它所拥有的函数源代码。在你的源代码中,没有任何地方使用x * 3。 - pvg
这是一个所谓的“闭包”。另请参阅“词法环境:共同理论”。 - user2683246
3个回答

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创建的闭包内部的值成为“硬编码”。


2

如果您拥有以下内容,那么它与您的情况是相同的:

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

如果您记录f,则会看到上面的函数,但是当您调用它时,n将从作用域链中最接近的名为n的变量获取其值,在我们的情况下,n = 3,全局范围内声明的n的值。
我不知道JS引擎在闭包中(在您的情况下是由multiple函数创建的)存储n变量的确切方式,但重要的是闭包中的变量保存为引用而不是

2

输入triple只是展示了你的函数的源代码

因为3被下面的代码塞入函数中,所以这是错误的说法。

那是一个不正确的陈述。你没有改变函数的源代码。要改变源代码,你必须重新定义整个函数。你所做的只是传递参数。控制台给出了正确的输出。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接