Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

说说闭包 #71

Open
LuckyWinty opened this issue Aug 8, 2020 · 2 comments
Open

说说闭包 #71

LuckyWinty opened this issue Aug 8, 2020 · 2 comments
Labels

Comments

@LuckyWinty
Copy link
Owner

闭包是一种设计原则,它通过分析上下文,来简化用户的调用,让用户在不知晓的情况下,达到他的目的;
闭包的定义就是:有权访问另一个函数作用域中的变量的函数。简单来说就函数中的函数。从技术上来讲,在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);
   };}
  • 所以《JavaScript高级程序设计》建议这么写:
function assignHandler(){
   var element = document.getElementById("someElement");
   var id = element.id;

   element.onclick = function(){
       alert(id);
   };

   element = null;}
@HSQCoollaughing
Copy link

闭包,一个特殊的对象

@HSQCoollaughing
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants