闭包
<h2>面试题-闭包</h2>
<blockquote>
<p>能够读取其他函数内部变量的函数,函数没有被释放,整条作用域链上的局部变量都得到保留</p>
<ul>
<li>由于js语言中,只有函数内部的内函数才能读取局部变量,因此可以把闭包理解成“<strong>定义在一个函数内部的函数</strong>”</li>
</ul>
</blockquote>
<h3>闭包的特性</h3>
<ul>
<li>函数内嵌套函数</li>
<li>
<p>闭包是有权访问另一个作用域变量的函数,创建闭包最常用的方式是:一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用域链
<strong>闭包的特性:</strong></p>
<pre><code> 函数内再嵌套函数
内部函数可以引用外层的函数或变量
参数或者变量不会被垃圾回收机制回收</code></pre>
</li>
</ul>
<pre><code class="language-javascript">var count = 10;//=>全局作用域
function add(){
var count=0;//私有作用域 标记为flag2
return function(){
count+=1;//函数的内部作用域
alert(count);
}
}
var s = add(); //=>返回的是:一个函数
s();//=>输出1
s();//=>输出2</code></pre>
<p>add()的返回值是一个函数,首次调用函数是s()的时候,是执行的是下面的这个函数:</p>
<pre><code class="language-javascript">function(){
count += 1;
alert(count);
}</code></pre>
<p>也就是将count+1,在输出,那count是从哪儿来的的呢,根据作用域链的规则,底层作用域没有声明的变量,会向上一级找,找到就返回,没找到就一直找,直到window的变量,没有就返回undefined。也就是将count+1,在输出,那count是从哪儿来的的呢,根据作用域链的规则,底层作用域没有声明的变量,会向上一级找,找到就返回,没找到就一直找,直到window的变量,没有就返回undefined。</p>
<h4>说说你对于闭包的理解</h4>
<ul>
<li>函数内在嵌套函数</li>
<li>一个函数能够访问另一个函数的变量或参数</li>
<li>闭包内的变量和参数不会被垃圾回收机制回收</li>
<li>使用闭包是为了设计私有的方法和变量。
<strong>优点</strong>:可以避免全局变量的污染
<strong>缺点</strong>: 闭包会常驻内存,会增加内存的使用量,使用不当会造成内存泄漏。在js中函数即闭包,只有函数才能产生作用域的概念。</li>
<li>闭包的最大用处有两个:1.读取函数内部的变量2.让这些变量始终保存在内存中 3.封装对象的私有属性和方法(实现封装及其缓存)</li>
<li>闭包的坏处:消耗内存,使用不当会造成内存的泄露
<blockquote>
<h3>使用闭包的注意点:</h3>
<ol>
<li>由于闭包会使函数中的变量保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中会导致内存泄露</li>
<li>解决方法:在退出函数之前将不使用的局部变量全部删除</li>
</ol>
</blockquote></li>
</ul>
<p>文章:<a href="https://muyiy.cn/blog/2/2.2.html#%E5%88%86%E6%9E%90">https://muyiy.cn/blog/2/2.2.html#%E5%88%86%E6%9E%90</a>
经典闭包面试题:<a href="https://juejin.im/post/5dff65d0518825123406ae9e">https://juejin.im/post/5dff65d0518825123406ae9e</a></p>