Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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 - Fatal编程技术网

一个简单的函数声明会在JavaScript中形成一个闭包吗?

一个简单的函数声明会在JavaScript中形成一个闭包吗?,javascript,Javascript,下面的代码是否会构成一个闭包 function f() {} 定义此函数的位置是否会影响答案?是的,无论在何处定义闭包,它都会定义闭包。这有几个示例。当函数在其词法范围内引用变量时,您将创建一个闭包: var a = 'foo' function f() {} // no closure function f() {return a} // closure 如果在函数中放置debugger语句,则可以在Chrome devtools中看到闭包包含的内容。您将看到第一个示例没有任何内容,而第二

下面的代码是否会构成一个闭包

function f() {}

定义此函数的位置是否会影响答案?

是的,无论在何处定义闭包,它都会定义闭包。这有几个示例。

当函数在其词法范围内引用变量时,您将创建一个闭包:

var a = 'foo'
function f() {} // no closure
function f() {return a} // closure

如果在函数中放置
debugger
语句,则可以在Chrome devtools中看到闭包包含的内容。您将看到第一个示例没有任何内容,而第二个示例将显示
a:'foo'
是的,它形成了一个闭包

闭包是函数引用和创建函数的环境的组合。无论函数如何调用,函数中的代码始终可以访问在创建函数的作用域中定义的任何变量

榜样;函数
f
将始终使用变量
x
,即使在无法访问
x
的范围内调用该变量:

函数容器(){
var x=42;
函数f(){
文件。编写(x);
}
返回f;
}
var func=container();
func();//显示42

//文件。写(x);//将给出一个错误,因为x不在范围内,因为javascript是一种特殊的语言(参见范围、提升和最近的TDZ),根据您在问题中的具体程度,您可能会得到不同的答案

这是javascript闭包吗?否。请参见Mozilla的定义

它是在一个闭包中捕获的(还是形成一个闭包-原始问题)?这取决于优化。但很可能是的。更重要的是


javascript“布道者”使用闭包术语来识别那些如果没有在实际闭包中捕获就无法正常工作的函数——从基本操作的角度来看,这是正确的说法。原因可能是因为缺少更好的术语,而不是其他任何术语。

闭包代表外部和内部功能。内部函数可以访问外部函数中定义的局部变量。所以一个普通的函数声明不会是一个闭包。那么当你引用和捕获变量时,你可以形成一个闭包。你可以在devtools中看到闭包包含的内容。通常,你从函数中返回一个函数来完成闭包。你读过吗?你应该读@elclars这与这里的答案不一致@BenAston:那里的答案说“如果F没有自由变量,那么它就不可能是闭包。”哪个和埃尔克兰斯相配description@Bergi答案是“JavaScript中的所有函数都是闭包,正如本文所解释的……”@BenAston:Ok,但这太笼统了。我认为该帖子“神话3”部分的以下句子很好地涵盖了这个问题:“重要的是要注意,每个函数的闭包创建过程都是相同的”。然而,那些不使用这个闭包特性的函数对我来说并不是闭包(这可能是吹毛求疵,但最匹配,事实上这是实际的JS引擎所做的)。所以“每个函数都可以是闭包”,但并非所有函数都是。@Bergi:Javascript中的所有函数都创建闭包。如果未使用闭包,则您可以认为它们没有闭包,但它们仍然有闭包。@Bergi运行函数会创建一个
LexicalEnvironment
,其中包含对定义它的
LexicalEnvironment
的引用(从而关闭父
LexicalEnvironment
)。这肯定是一个结束,父母或祖父母中是否存在变量,这是没有意义的?@Bergi:我想你对什么是结束感到困惑。无论是否使用任何变量,都不会改变每个函数都有一个创建它的环境的事实。@Bergi我将此作为答案,因为JS VM的内部优化不应影响我对该语言的概念理解。@Bergi事实上,我在写作时对这些概念有很好的理解这个问题,但多亏了你自己和Guffa,我现在有了极好的理解。@BenAston Good,这才是最重要的:-)为什么这被否定了?有人能解释一下为什么这是一个糟糕的答案吗?如果能知道投票被否决的原因就好了。