以下代码是否会形成闭包?
function f() {}
定义此函数的位置会影响答案吗?
答案 0 :(得分:4)
是的,它形成了一个封闭。
闭包是函数引用和创建函数的环境的组合。无论函数如何被调用,函数中的代码总是可以访问创建函数的作用域中定义的任何变量。
实施例;函数f
将始终使用变量x
,即使它在无法访问x
的范围内调用:
function container() {
var x = 42;
function f() {
document.write(x);
}
return f;
}
var func = container();
func(); // displays 42
//document.write(x); // would give an error as x is not in scope
答案 1 :(得分:1)
当函数在其词法范围内引用变量时,您创建一个闭包:
var a = 'foo'
function f() {} // no closure
function f() {return a} // closure
如果在函数中放置debugger
语句,您可以在Chrome devtools中看到闭包含什么。您将看到第一个示例没有任何内容,而第二个示例将显示a: 'foo'
答案 2 :(得分:0)
是的,它始终定义一个闭包,无论它在何处定义。这个tutorial有一些说明性的例子。
答案 3 :(得分:-1)
因为javascript是一种特殊语言(请参阅范围,提升以及最近的TDZ),根据您在问题中的具体具体情况,您可能得到不同的答案。
是javascript关闭吗?不。请参阅Mozilla的定义https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
它是在一个闭包中捕获的(还是形成一个闭包 - 最初的问题)?取决于优化。但很可能是的。请参阅http://dmitrysoshnikov.com/ecmascript/chapter-6-closures/,更重要的是https://en.wikipedia.org/wiki/Closure_%28computer_programming%29
关闭术语由javascript"福音传道者使用"识别那些在实际闭包中没有被捕获的功能 - 这是从基本操作的角度来说这是正确的方法。原因可能是由于缺乏一个更好的术语而不是其他任何东西。