闭包(Closure)概念
全局上下文
一旦<script></script>标签中代码运行起来,就会产生一个执行上下文,这个执行上下文就是全局执行上下文.全局上下文只有一个 全局执行环境是window对象,所有变量和函数都作为window对象的属性和方法创建的 所有的代码都在全局执行上下文中执行
函数执行上下文
每次调用函数都会产生一个执行上下文,函数调用完成后,会把执行上下文释放掉。 按照函数的调用顺序,这些上下文以栈的形式存储(先进后出).栈底是全局上下文。
在js中,在函数体中可以再次定义另一个函数;并且可以多层函数嵌套使用。
从闭包的定义可以抓住两个关键点: 函数嵌套定义 、引用变量
通过前面的几个相关知识点,可以发现在JS中,函数内部可以通过作用域链机制轻松得到父级函数内的变量乃至全局变量,而反过来则是行不通的,即函数外部是无法读取函数内局部变量的。 那么如果有的场景必须要得到函数内部的局部变量时,需要变通方法那么就产生了闭包。 可以在本质上去理解闭包,闭包就是将函数内部和函数外部连接起来的一座桥梁,可以使局部变量被外部函数访问到,也就是说变相的延长了函数中局部变量的寿命。 上段代码
function f(){
var a = 1;
function f1(){
console.log(a);
}
return f1;
}
var r = f();
r();
这段代码执行后,结果输出为1。也就是说当函数f调用结束后,它的局部变量a并没有被回收掉。可以说这就是闭包的本质,它使得函数调用结束后,被闭包引用的变量没有被回收机制干掉而顺利存活了下来,还可以被外部访问和使用。
根据前面的理解,可以归纳闭包的作用有:
读取函数内部的变量
延长这些变量的生命周期
使用闭包的栗子来一个 - 节流函数 ,可以让一个函数变得"懒",调用一次之后需要隔一段时间才能再次调用,即降低函数的可被调用的频率。话不多说上代码
上面的代码中,f1就是被节流函数变懒了的test。 代码运行中,f函数中t1这个局部变量被f函数内部定义的t函数引用后,当f函数调用执行完毕后,t1这个变量并没有随之被回收,而是一直可以被访问。这就是闭包的体现。
使用闭包能够让局部变量模拟全局变量一样,但是它只能被特定函数使用。我们都知道:1.全局变量可能会造成命名冲突,使用闭包不用担心这个问题,因为它是私有化,加强了封装性,这样保护变量的安全
闭包是一个让初级JavaScript使用者既熟悉又陌生的一个概念。因为闭包在我们书写JavaScript代码时,随处可见,但是我们又不知道哪里用了闭包。
JavaScript 变量可以是局部变量或全局变量。私有变量可以用到闭包。闭包就是将函数内部和函数外部连接起来的一座桥梁。函数的闭包使用场景:比如我们想要一个函数来执行计数功能。
闭包(closure)是 Javascript 语言的一个难点,面试时常被问及,也是它的特色,很多高级应用都要依靠闭包实现。本文尽可能用简单易懂的话,讲清楚闭包的概念、形成条件及其常见的面试题。
在不使用ES6的前提下如何将一个多个异步请求按顺序执行呢?要求使用JavaScript代码按顺序依次请求这5张图片,一次只能请求一张,可以结合 闭包+回调+递归 组合来解决
for循环中let 和var的区别,setTimeout(func,time)函数运行机制,一个需求,一个数组array[1,2,3,4,5],循环打印,间隔1秒
立即执行函数是基于匿名函数实现的,也没有函数名,会在定义后立即执行;闭包是有权访问另一个函数作用域中的变量的函数。匿名函数、立即执行函数只要满足 有权访问另一个函数作用域中的变量 这一个条件,就成了闭包。
JavaScript的运行机制:(1)所有同步任务都在主线程上执行,形成一个执行栈。(2)主线程之外,还有一个“任务队列”,只要异步任务有了运行结果,就在“任务队列”之中放置一个事件。
闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式就是在一个函数内部创建另一个函数。来看下面的示例:
闭包这个词一听就很高级,令人害怕。但实际上,闭包非常的强大,JS 的精髓之一就是闭包。实际上,我们经常在使用闭包,而不自知!
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!