将一个简单的函数声明形成JavaScript中的闭包
Will a simple function declaration form a closure in JavaScript?
下面的代码会形成闭包吗?
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"传道者"使用闭包术语来识别那些如果没有在实际闭包中捕获到就无法正常工作的函数——从根本操作的角度来看,这是正确的说法。原因可能是缺少一个更好的术语,而不是其他任何东西。
相关文章:
- 声明JavaScript选项对象的正确方法
- 声明Javascript名称空间的两种方法之间的区别
- 声明 JavaScript 变量
- 解析函数声明 Javascript
- 在 Rails 3 中声明 Javascript 变量时出错
- 我应该在对象原型中声明javascript对象方法吗
- 淘汰高级声明javascript"用“-喜欢
- 动态编辑html声明javascript
- 在构造函数和原型中声明javascript对象方法
- 声明javascript对象时在其变量中引用该对象
- 在typescript中声明javascript命名空间
- 声明javascript对象属性问题
- 在HTML链接中声明JavaScript变量
- 声明Javascript变量的所有可能方法
- 声明JavaScript成员函数的最佳实践
- 如何在ios中声明javascript
- 有效地声明JavaScript变量
- 以更简洁的方式声明javascript静态方法
- 使用function-prototype声明Javascript命名空间
- 如何在对象中正确声明Javascript对象数组