Javascript 系统在哪里存储闭包引用的变量

Javascript 系统在哪里存储闭包引用的变量,javascript,Javascript,如果在外部函数中返回一个闭包,并且该闭包引用了该外部函数中定义的一些变量,那么该外部函数是否会在return语句之后被循环使用 由于闭包仍然可以访问变量,系统在哪里存储这些变量 谢谢 我起初不理解你的问题,现在我正在更新我的答案 解释:- 可以在函数中嵌套函数。嵌套(内部)函数是其包含(外部)函数的私有函数。它还形成了一个闭包 闭包是一个表达式(通常是一个函数),可以将自由变量与绑定这些变量的环境结合在一起(即“关闭”表达式) 由于嵌套函数是闭包,这意味着嵌套函数可以“继承”其包含函数的参数和变

如果在外部函数中返回一个闭包,并且该闭包引用了该外部函数中定义的一些变量,那么该外部函数是否会在return语句之后被循环使用

由于闭包仍然可以访问变量,系统在哪里存储这些变量


谢谢

我起初不理解你的问题,现在我正在更新我的答案

解释:- 可以在函数中嵌套函数。嵌套(内部)函数是其包含(外部)函数的私有函数。它还形成了一个闭包

闭包是一个表达式(通常是一个函数),可以将自由变量与绑定这些变量的环境结合在一起(即“关闭”表达式)

由于嵌套函数是闭包,这意味着嵌套函数可以“继承”其包含函数的参数和变量。换句话说,内部函数包含外部函数的范围

总结如下:

function outside(x) {
function inside(y) {
  return x + y;
}
return inside;
}
fn_inside = outside(3); 
result = fn_inside(5); // returns 8

result1 = outside(3)(5); // returns 8
只能从外部函数中的语句访问内部函数

内部函数形成闭包:内部函数可以使用外部函数的参数和变量,而外部函数不能使用内部函数的参数和变量

以下示例显示了嵌套函数:

function addSquares(a,b) {
function square(x) {
  return x * x;
}
return square(a) + square(b);
}
a = addSquares(2,3); // returns 13
b = addSquares(3,4); // returns 25
c = addSquares(4,5); // returns 41
由于内部函数形成闭包,因此可以调用外部函数并为外部函数和内部函数指定参数:

function outside(x) {
function inside(y) {
  return x + y;
}
return inside;
}
fn_inside = outside(3); 
result = fn_inside(5); // returns 8

result1 = outside(3)(5); // returns 8
变量的保存

请注意,当返回inside时,x是如何被保留的。闭包必须在其引用的所有作用域中保留参数和变量。由于每个调用提供可能不同的参数,因此为每个外部调用创建一个新的闭包。只有当返回的内存不再可访问时,才能释放内存

这与在其他对象中存储引用没有什么不同,但通常不太明显,因为不直接设置引用,也无法检查它们


设置全局变量后,它将添加到窗口对象中

var myValue;
function setValue()
{
myValue = "test";
}

function getValue()
{
alert(window.myValue); // yup, it's "test"
}

每个闭包最终将创建新的类/函数 闭包引用的每个变量都是它的一个字段/属性 所以,不,不会被垃圾收集
当闭包的类/函数实例没有引用时,它将被垃圾收集

我说的不是全局变量,我说的是外部函数中定义的局部变量,由闭包引用。你知道,在javascript中,每件事都是一个对象,函数也是。他们在某种程度上都受到约束。您可以通过打开dom窗口在firebug中查看此层次结构。mozilla使用spider monkey作为javascript引擎。您可以访问这里:@developerCK问题是OP并不是在谈论全局变量。的确,声明一个不带var的变量(或者这个)会使它成为全局变量,但是如果声明一个带var的变量,你就可以访问这种变量,除非你定义了闭包。我认为OP的问题是关于这类变量。我想说在内存中,但我认为这是不够的。任何变量都会在从全局对象开始的任何“路径”无法访问时被释放,这是唯一的规则。未指定应发生的时间。所有数据的存储方式也未指定,但是,除非您正在编写自己的javascript引擎或调整现有的javascript引擎,否则您不应该在意。只是想知道引擎将在何处存储这些外部函数中定义的局部变量,因为这些变量的生命周期似乎与外部函数本身不同。javascript标准没有指定捕获变量的位置或者外部函数发生了什么。不同的引擎可能会做不同的事情。调用内部函数时,外部对象将包含在内部函数(闭包)的执行上下文中。当您说外部对象时,您是指外部函数本身吗?JavaScript中的每个函数还包含包含函数中的所有变量。因此,即使外部对象被垃圾回收,闭包函数仍然具有这些变量。这是一个很好的解释:。