闭包

随处可见的闭包分享, 还是自己写写加深印象。

基本概念:

    函数执行环境: 书上说 执行环境定义了变量或函数有权访问的其它数据。我理解为执行环境就是内存中运行一个函数的一定空间。一个执行环境都有一个关联的变量对象, 环境中定义的所有变量和函数都保存在变量对象中。当调用一个函数时就会创建一个执行环境,然后使用arguments和其他命名参数来初始化函数活动对象。当环境中所有代码执行完毕后, 执行环境就被销毁,即在内存中清除。

   全局执行环境: 在Web浏览器中,阔以认为全局执行环境就是window对象

   作用域链: 本质是指向作用域变量对象的指针列表。用来保证对执行环境有权访问的所有变量和函数的有序访问, 重点在于有序, 有先后顺序。作用域链最前端,始终是当前执行的代码所在环境的变量对象;最后一个始终是全局执行环境。

1.什么是闭包?

 闭包是指有权访问另一个函数作用域中的变量的函数。最开始认为在一个函数里创建了另一个函数,这种情况下合起来才是一个闭包,然而并不是。闭包仅仅指的是里面的那个函数。

 function funOut (name) {

   return function (value) {  <-----这个函数才是闭包,假设称为funIn

      return value[name]

    }   

 }

  函数funOut内部定义了函数funIn, 那么funIn会吧funOut的活动对象添加到自身作用域链中。在funOut函数执行完毕后,由于funIn函数作用域链还保持着对funOut活动对象的引用,所以funOut的作用域链会被销毁, 活动对象会被保留直到funIn函数被销毁。

  副作用: 闭包只能取得包含函数中任何变量的最后一个值。

  其他: 在闭包中使用this可能会导致一些问题。

  闭包的不足之处:

          ①闭包会携带它的函数的作用域,比其他函数更占内存。

          ②<IE9浏览器可能会引起内存泄漏。内存泄漏是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

2.闭包的作用

   ①模拟块级作用域(私有作用域)

           (function () {

                    // 块级作用域

              })() 

              好处: 经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数, 减少闭包占用内存问题。对开发人员来说,在块级作用域中既可以使用自己的变量, 又不必担心搞乱全局作用域。

     ②在对象中创建私有变量

             私有变量: 任何在函数中定义的变量。包括函数的参数, 局部变量, 函数内部定义的其它函数。

             特权方法: 有权访问私有变量和私有函数的公有方法。

方法1: 

function Person (name) {
this.getName = function () {
return name
}
this.setName = function (value) {
name = value
}
}

             利用私有和特权成员, 可以隐藏那些不应该被直接修改的数据。在构造函数中定义特权方法的缺点就是必须要使用构造函数。使用构造函数呢针对每一个实例都会创建同一组新方法。

             解决: 通过在私有作用域中来定义私有变量和函数。

  方法2:

(function () {
var name = ''
// 初始化未经声明的变量,总是会创建一个全局变量
Person = function (value) {
name = value
}
Person.prototype.getName = function () {
return name
}
Person.prototype.setName(value) {
name = value
}
})()

每一个方法1构建的Person实例都有自己独立的name,方法2中每一个实例都访问的是同一个私有变量name,在一个实例上调用setName会改变所有实例的值。

 

转载于:https://www.cnblogs.com/haboll/p/9305973.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值