返回功能Chrome开发工具

时间:2015-12-21 17:08:55

标签: javascript function google-chrome-devtools

这个问题可以在别处回答,但我甚至不确定如何开始寻找答案。我是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 个答案:

答案 0 :(得分: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不是硬编码的;它与任何其他变量没有什么不同。在您的具体示例中,在n终止后无法修改multiple,但这不会以任何方式调用multiple调用创建的闭包内的值#34;硬编码"

答案 1 :(得分:2)

嗯,这与你的情况相同:

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

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

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

答案 2 :(得分:2)

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

  

因为3通过以下代码被编码到函数中

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

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