网站建设的优点和不足,侵入别人的网站怎么做,wordpress图片上传错误,frontpage2003网页制作视频教程当我们说到闭包#xff0c;在JavaScript中闭包是一个让人难以理解甚至说是一个近乎神话的概念。闭包往往也是面试必考的题目#xff0c;如果能够掌握闭包对我们自己来说那也是一种极大的提升。在学习的过程中不要害怕闭包#xff0c;闭包并不是一个新的语法或者模式#xf…当我们说到闭包在JavaScript中闭包是一个让人难以理解甚至说是一个近乎神话的概念。闭包往往也是面试必考的题目如果能够掌握闭包对我们自己来说那也是一种极大的提升。在学习的过程中不要害怕闭包闭包并不是一个新的语法或者模式他只是基于词法作用域书写代码时产生的自然结果我们需要做的就是去识别、拥抱和影响闭包的思维。
这里先给出闭包的概念什么是闭包这个概念来自于《你不知道的JavaScript上卷》一书所谓闭包当函数可以记住并访问所在词法作用域时就产生了闭包即使函数是在当前词法作用域之外执行。
直接上代码
function foo(){var a 2;function bar(){console.log(a)}return bar
}
var baz foo()
baz() // 2以上代码就是一个闭包试着分析一下这段代码都干了写什么
foo函数作用域内部声明了变量a其内部又嵌套函数bar。在bar函数内部访问了其作用域上的变量a它在自己身上没找到继续往上在foo身上找到了变量a。在foo函数内部将bar函数作为返回值进行返回。将foo函数赋值给变量baz最后调用了baz输出结果为2。
将foo赋值给baz实际上是直接引用了内部函数bar而bar内部访问了变量a。通常来说foo执行完之后整个内部作用域都会被引擎销毁浏览器是有一个垃圾回收机制的。而闭包正好阻止了这件事情的发生它的内部作用域依然存在因为bar还在使用它访问了foo内部的变量a,bar还持有对foo作用域的引用这个引用就是闭包什么是闭包这就是闭包。闭包的神奇之处在于它可以延长变量的生命周期。
当函数在别处被调用是也可以观察到闭包
function foo2(){var a 3;function baz2(){console.log(a)}bar2(baz2)}function bar2(fn){fn();}foo2() // 3传递函数也可以是简介的
// 传递函数也可以是间接的var fn;function foo3(){var a 4;function baz3(){console.log(a)}fn baz3}function bar3(){fn()}foo3()bar3() // 4以上示例代码均来自《你不知道的JavaScript上卷》一书 总结一下闭包其实就是我们在写代码时基于JavaScript词法作用域产生的一个自然的结果我们无需畏惧它要尝试着理解并去拥抱它。其实就是一个函数能够记住并访问其所在的词法作用域中的变量这样就产生了闭包闭包的作用是延长了变量的生命周期阻止了浏览器垃圾回收机制去立即回收变量。