将一个简单的函数声明形成JavaScript中的闭包

Will a simple function declaration form a closure in JavaScript?

本文关键字:声明 JavaScript 闭包 函数 一个 简单      更新时间:2024-02-22

下面的代码会形成闭包吗?

function f() {}

这个函数的定义会影响答案吗?

是的,它形成了一个闭包。

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

示例;函数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

是的,无论在哪里定义,它总是定义闭包。本教程有几个示例。

当函数在其词法作用域中引用变量时,您会创建一个闭包:

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

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

因为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"传道者"使用闭包术语来识别那些如果没有在实际闭包中捕获到就无法正常工作的函数——从根本操作的角度来看,这是正确的说法。原因可能是缺少一个更好的术语,而不是其他任何东西。