Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.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,我知道foo将被关闭,因为internal()将需要它 但是bar也会关闭吗?它在internal()的作用域中,但是internal()没有使用它特定变量本身不会被结转。当创建闭包时,整个范围将被结转。在这种情况下,foo和bar以及该作用域中存在的任何变量都将在内部函数中可用。理论上,整个父作用域被关闭,包括变量foo和bar以及对其父范围的引用:函数internal可能需要它。至少这就是它的规格。实际上,引擎可以自由地对此进行优化,并对所有未引用的内容进行垃圾收集,例如。好的,谢谢。那么,

我知道
foo
将被关闭,因为
internal()
将需要它


但是
bar
也会关闭吗?它在
internal()
的作用域中,但是
internal()
没有使用它特定变量本身不会被结转。当创建闭包时,整个范围将被结转。在这种情况下,
foo
bar
以及该作用域中存在的任何变量都将在
内部
函数中可用。

理论上,整个父作用域被关闭,包括变量
foo
bar
以及对其父范围的引用:函数
internal
可能需要它。至少这就是它的规格。实际上,引擎可以自由地对此进行优化,并对所有未引用的内容进行垃圾收集,例如。

好的,谢谢。那么,结转的只是直接父范围,还是所有父范围?其他语言是否以不同的方式实现了这一点?当您只需要部分作用域时,将整个作用域向前推进似乎有些过分。@AdamZerner您在内部函数中使用的变量的作用域将向前推进AH ok。因此,由于
foo
用于
internal
,并且
foo
的范围是
outer
,因此
outer
将在
internal
中结转。您可以这样说@adamzer通常看起来“在
internal
声明点的作用域中的所有变量都可以在闭包中使用”(从JavaScript的秘密中释义,仅父作用域?看起来“在internal声明点的作用域中的所有变量都可以在闭包中使用”(摘自《JavaScript的秘密》Ninja@AdamZerner:有一个作用域链,每个作用域都有一个对其父作用域的引用。一个闭包作用域可以(将)在其中定义的所有函数之间共享。“作用域中的所有变量”指的是当前作用域变量,以及从中可访问的所有其他变量。
var foo = 'outer';
function outer() {
    var foo = 'closure';
    var bar = 'baz';
    return function inner() {
        console.log(foo);
    }   
}