JavaScript 闭包

来源:互联网 发布:澳门大学 知乎 编辑:程序博客网 时间:2024/05/26 08:41

什么是闭包?

在一个函数里面嵌套另外一个函数。嵌套(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); // 25pow3(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
原创粉丝点击