文章博客

技术团队文档示例


闭包

<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;//=&gt;全局作用域 function add(){ var count=0;//私有作用域 标记为flag2 return function(){ count+=1;//函数的内部作用域 alert(count); } } var s = add(); //=&gt;返回的是:一个函数 s();//=&gt;输出1 s();//=&gt;输出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>

页面列表

ITEM_HTML