函数体内部的变量都可以保存在函数作用域内. ----- 闭包 (函数变量可以被隐藏于作用域链之内, 因此看起来是函数将变量 "包裹" 了起来)
当一个函数嵌套另外一个函数, 外部函数将嵌套的对象作为返回值返回. 往往就时闭包了. 理解闭包首先了解嵌套函数的词法作用域规则.
- var scope = 'global scope';
- function checkscope(){
- var scope = 'local scope';
- function f(){return scope};
- return f;
- }
- checkscope()()
- //"local scope"
特性: 可以捕捉到局部变量 (和参数), 并一直保存下来, 看起来像这些变量绑定到了在其中定义它们的外部函数.
- var unique = (function(){
- var conter = 0;
- return function(){return conter++}
- }());
- unique()
利用闭包实现私有属性存取器方法 (私有状态共享的通用做法):
- function addPrivateProperty(o,name,predicate){
- var value;
- o[`get${name}`] = function(){return value;};
- o[`set${name}`] = function(v){
- if(predicate && !predicate(v))
- throw Error(`set ${name}:invalid value ${v}`)
- else
- value = v;
- }
- }
- var o = {};
- addPrivateProperty(o,'Name',function(x){return typeof x == "string"});
- o.setName("Frank");
- console.log(o.getName());
在同一个作用域链中定义两个闭包, 这个两个闭包共享同样的私有变量或者变量, 这是一种非常重要的技术.
重要点: 闭包内无法直接访问外部函数的参数数组, 除非外部函数将参数数组保存在另外一个变量中:
- var outerArguments = arguments;
- var that = this;
来源: http://www.bubuko.com/infodetail-2585264.html