JavaScript 闭包

什么是闭包?

在一个函数里面嵌套另外一个函数。嵌套(nest)(内部, inner)函数是容器(containing)(外部, outer)函数的私有成员。它自身也形成了一个闭包(closure)。一个闭包是一个可以自己拥有独立的环境与变量的表达式(通常是函数)。闭包就是携带状态的函数,并且它的状态可以完全对外隐藏起来。

  • 内部函数以某一种方式被任何一个外部函数作用域访问时,一个闭包就产生了;
  • 在没有class机制,只有函数的语言里,借助闭包,同样可封装私有变量;
  • 内部函数只可以在外部函数中访问(不是任意地方);
  • 内部函数形成了一个闭包:它可以访问外部函数的参数和变量,但是外部函数却不能使用它的参数和变量.
如何使用闭包?
示例一:闭包保存参数
function outside(x) {
  function inside(y) {
    return x + y;
  }
  return inside; //返回的是个闭包函数
}
//先给闭包函数赋值,再调用
fn_inside = outside(3); 
result = fn_inside(5); // returns 8
//同时指定外部和内部函数的参数,再调用
result1 = outside(3)(5); // returns 8

注意:一个闭包必须保存它可见作用域中所有的参数和变量。因为每一次调用传入的参数都可能不同,每一次对外部函数的调用都实际上重新创建了一遍这个闭包(函数)。例如:

示例二:改变闭包参数,创造新函数
function make_pow(n) {
    return function (x) {
        return Math.pow(x, n);
    }
}
// 创建两个新函数: 闭包会当做private变量一样保存自身的参数,相当于返回的新函数是因为内部(闭包)参数不同导致的。
var pow2 = make_pow(2);
var pow3 = make_pow(3);
pow2(5); // 25
pow3(7); // 343
示例三:域链(scope chaining): 更近的作用域有更高的优先权;递归内部包含外部所有作用域.
function A(x) {
  function B(y) {
    function C(z) {
      console.log(x + y + z);
    }
    C(3);
  }
  B(2);
}
A(1); // 控制台输出 6 (1 + 2 + 3)
/*
 - B形成了一个包含A的闭包,B可以访问A的参数和变量 
 - C形成了一个包含B的闭包
 - B包含A,所以C也包含A,C可以访问B和A的参数和变量。换言之,C用这个顺序链接了B和A的作用域
*/
参考资料:
  1. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Functions
  2. http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值