这个问题可以在别处回答,但我甚至不确定如何开始寻找答案。我是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);
答案 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通过以下代码被编码到函数中
这是一个不正确的陈述。您没有更改该函数的源代码。要更改源代码,您必须重新定义整个函数。你所做的只是传递一个参数。控制台正在为您提供正确的输出。
当您将参数传递给函数时,在高级别,在运行时,它只是查找存储在该变量的内存地址中的任何值(或类似的东西)。但它并没有重写函数的源代码。