Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 封闭函数在执行后或返回闭包函数后驻留在何处?_Javascript_Closures - Fatal编程技术网

Javascript 封闭函数在执行后或返回闭包函数后驻留在何处?

Javascript 封闭函数在执行后或返回闭包函数后驻留在何处?,javascript,closures,Javascript,Closures,了解了闭包的基本知识后,有一个疑问仍然困扰着我: 封闭函数在执行后或返回闭包函数后驻留在何处? 我相信函数驻留在堆栈数据结构中,一旦函数完成其执行/返回任何值,就会从堆栈顶部删除 但在闭包中,内部函数仍然必须访问封闭函数的状态,如何 function sayHello(name) { var text = name + ' !!!'; // Local variable return function(wish) { console.log(wish + ', ' +text); } }

了解了闭包的基本知识后,有一个疑问仍然困扰着我:

封闭函数在执行后或返回闭包函数后驻留在何处?

我相信函数驻留在堆栈数据结构中,一旦函数完成其执行/返回任何值,就会从堆栈顶部删除

但在闭包中,内部函数仍然必须访问封闭函数的状态,如何

function sayHello(name) {
  var text = name + ' !!!'; // Local variable
  return function(wish) { console.log(wish + ', ' +text); }
}

var say = sayHello('Bob');

say('Hey');
say('Hello');

当它从函数堆栈框架中删除函数时,当它返回函数时,
sayHello
在哪里出现?

这是一篇非常好的文章

范围链

当任何JavaScript代码执行时,它都需要一些地方来存储其局部变量。让我们把这个地方称为scope对象(有些人将其称为LexicalEnvironment)。例如,当您调用某个函数,并且该函数定义了局部变量时,这些变量将保存在scope对象上。您可以将其视为一个常规JavaScript对象,其显著区别是您不能直接引用整个对象。您只能修改其属性,但不能引用范围对象本身

范围对象的概念与C或C++不同,其中局部变量存储在堆栈上。在JavaScript中,作用域对象是在堆中分配的(或者至少它们的行为是这样的),所以即使函数已经返回,它们也可能保持分配状态。稍后再谈

正如您所料,范围对象可能具有父对象。当代码试图访问某个变量时,解释器将查找当前范围对象的属性。如果属性不存在,解释器将移动到父范围对象,并在那里查看。依此类推,直到找到值,或者不再有父项。让我们将这个范围对象序列称为范围链


解析作用域链上的变量的行为与原型继承的行为非常相似,但又有一个显著的区别:如果您试图访问常规对象的一些不存在的属性,而原型链也不包含此属性,那么这不是一个错误:undefined将以静默方式返回。但是,如果您试图访问作用域链上不存在的属性(即访问不存在的变量),则会发生ReferenceError。

“但是在闭包中,内部函数仍然必须访问封闭函数的状态,如何?”这是一个实现细节,不同的引擎可能会执行不同的操作,但环境不同(保存绑定的)很可能存储在堆上。@FelixKling谢谢你的回答。我还有几个问题,比如:函数和对象在Javascript中驻留在哪里?Dint在联机中找不到任何帮助。你有什么资源可以更清楚地了解JS中的内存分配和管理吗?