LuckyWinty / fe-weekly-questions

A pro to record some interview questions every week...
MIT License
342 stars 34 forks source link

说说闭包 #71

Open LuckyWinty opened 4 years ago

LuckyWinty commented 4 years ago

闭包是一种设计原则,它通过分析上下文,来简化用户的调用,让用户在不知晓的情况下,达到他的目的; 闭包的定义就是:有权访问另一个函数作用域中的变量的函数。简单来说就函数中的函数。从技术上来讲,在JS中,每个function都是闭包,因为它总是能访问在它外部定义的数据。很多时候我们写js的时候都用到了闭包,只是我们不知道已经用到了而已。 闭包的应用场景非常多。 例如

  1. 使用闭包代替全局变量,构造块级作用域,进行模块化开发。 可解决: 全局变量有变量污染和变量安全等问题。

2.函数外或在其他函数中访问某一函数内部的参数 为了解决在Ajax callback回调函数中经常需要继续使用主调函数的某一些参数。 3.在函数执行之前为要执行的函数提供具体参数 某些情况下,是无法为要执行的函数提供参数,只能在函数执行之前,提前提供参数。 有哪些情况是延迟执行? 如:setTimeOut setInterval Ajax callbacks event handler[el.onclick=func 、 el.attachEvent("onclick",func)]

闭包是基于执行环境中的作用域的。执行环境就是一个定义了变量或者函数有权访问的其他数据,决定了它们各自的行为的环境。这个环境中有一个变量对象保存着环境中定义的所以变量和函数。 当函数在一个环境中执行时,会创建变量对象的一个作用域链。而当执行完这个函数时, 如果这时相应的变量对象没有被引用,则变量对象占用的空间会被释放。但是,当一个闭包内引用着活动对象中的变量时,活动对象不被释放。 由这个也可以看出,闭包的一个缺点就是会造成内存泄漏。 例如: 如果闭包的作用域链中保存着一个HTML 元素,那么就意味着该元素将无法被销毁,代码如下,只要匿名函数存在,element 的引用数至少也是 1,因此它所占用的内存就永远不会被回收。

function assignHandler(){
   var element = document.getElementById("someElement");
   element.onclick = function(){
       alert(element.id);
   };}
HSQCoollaughing commented 3 years ago

闭包,一个特殊的对象

HSQCoollaughing commented 3 years ago

闭包是一个特殊的对象 它由两部分组成,执行上下文A以及在A中创建的函数B。 当B执行时,如果访问了A中的变量对象,那么闭包就会产生。