ITPub博客

首页 > 应用开发 > Javascript > 好程序员技术分享浅谈JavaScript中的闭包

好程序员技术分享浅谈JavaScript中的闭包

Javascript 作者:好程序员IT 时间:2019-04-04 11:58:56 0 删除 编辑

好程序员 技术分享 浅谈 JavaScript 中的闭包 js 闭包 是指有权访问另一个函数作用域中的变量的函数 , 个人认为 js 闭包最大的用处就是防止对全局作用域的污染。 试想如果我们把一些仅仅只用到一两次的变量都声明在全局作用域中,最后肯定是容易出错且不可维护的。而闭包最神奇的地方就是能在一个函数外访问函数中的局部变量,把这些变量用闭包的形式放在函数中便能避免污染。

一、闭包是什么?

JavaScript 高级程序设计》中写道: “闭包是指有权访问另一个函数作用域中的变量的函数”,如果用下定义的观点看,这句话就是说“闭包是函数”,我带着怀疑的心态又去网上找了找,发现什么说法都有,终究没能明白闭包的含义,还是看代码来得直接。 ·

function outter() {

   var  sky= "blue" ;

   function inner() {

     console .log(sky);

  }

 

   return  inner;

} var  result=outter();

result();     //"blue"

这段代码就包含一个简单的闭包: outter函数的返回值是一个函数,即inner。inner在outter内部,理所当然能访问到局部变量sky,但当inner作为outter的返回值赋给outter外的全局变量时,神奇的事情发生了:在全局作用域中访问到了sky,这就是闭包。

二、闭包的原理 ?

每个函数都有自己的执行环境,当一个函数被执行时,它的执行环境就会被推入环境栈,其活动对象 (存储环境中定义的变量及函数)加入作用域链中,一旦函数执行完,栈将其环境弹出,活动对象被销毁。

对于上面的例子来说, outter执行完之后将返回inner给了result,outter的执行环境从环境栈弹出,控制权交给全局环境,outter的活动对象理应被销毁。但此时inner已经存储在全局活动对象中了,同时inner需要访问sky,所以outter的活动对象没有被销毁,即使result执行完毕,outter的活动对象依然存在于作用域链中,只有当result被销毁

//code from http://caibaojian.com/javascript-closure.htmlresult  = null

outter的活动对象才会彻底释放。

三、闭包有什么用 ?

说了这么多,闭包到底有什么用呢?我个人认为闭包最大的用处就是防止对全局作用域的污染。   试想如果我们把一些仅仅只用到一两次的变量都声明在全局作用域中,最后肯定是容易出错且不可维护的。而闭包最神奇的地方就是能在一个函数外访问函数中的局部变量,把这些变量用闭包的形式放在函数中便能避免污染。

四、 Caveat

·  闭包将函数的活动对象维持在内存中,过度使用闭包会导致内存占用过多;

·  闭包只能取得外部函数中任何变量的最后一个值,在使用循环且返回的函数中带有循环变量时会得到错误结果;

·  当返回的函数为匿名函数时,注意匿名函数中的 this指的是window对象。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69913892/viewspace-2640388/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-03-20

  • 博文量
    188
  • 访问量
    144880