闭包的漏洞

1. 闭包的定义

  • 闭包就是能够读取其他函数内部变量的函数。在JavaScript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。本质上,闭包是将函数内部和函数外部连接起来的桥梁。

2. 构成闭包的条件

  1. 在函数A内部直接或间接返回一个函数B
  2. 函数B内部使用函数A的私有变量
  3. 函数A外部有一个变量接收函数B

下面是一个典型的闭包场景

function a(){
    var num = 100
    return (function b(){
        console.log(num);
    })()
}
a() // 100

3. 闭包的漏洞

  • 定义:在不改变闭包的情况下修改闭包里面的私有变量

下面是一个闭包漏洞的例子

 var o = (function (){
   var obj = {
       a: 1,
       b: 2,
   }
   return{
       get: function(k){
           return obj[k]
       }
   }
})()

下面是闭包漏洞的实现方法

// 在全局Object对象中添加add属性,返回的是this
// 作用是返回当前调用Object对象原型链add属性的对象
Object.defineProperty(Object.prototype, 'add', {
  get(){
    return this
  }
})
console.log(o.get('add')); // { a: 1, b: 2 }
// o.get('add')即可获取obj对象
// 原理是obj对象读取Object对象原型链上的add属性
o.get('add').a = '海绵宝宝' // 修改obj对象的a属性
// 验证a属性被修改成功
console.log(o.get('a')); // 派大星

4. 闭包的漏洞防止方法

4.1 判断法

var o = (function (){
  var obj = {
    a: 1,
    b: 2,
  }
  return{
    get: function(k){
      // 判断obj对象是否有属于它对应的属性
      if(obj.hasOwnProperty(k)){ 
        return obj[k]
      }
      // 不是obj对象本身的属性就返回undefined
      return undefined
    }
  }
})()

4.2 置空法

var o = (function (){
  var obj = {
    a: 1,
    b: 2,
  }
  // 把obj对象在Object原型链上置为null
  Object.setPrototypeOf(obj, null)
  return{
    get: function(k){
        return obj[k]
    }
  }
})()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伍嘉源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值