返回函数 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".
这个问题可能在其他地方有答案,但我什至不确定如何开始寻找答案。我是 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".