JavaScript的闭包

函数体内部的变量都可以保存在函数作用域内。 -----闭包(函数变量可以被隐藏于作用域链之内,因此看起来是函数将变量“包裹”了起来)

当一个函数嵌套另外一个函数,外部函数将嵌套的对象作为返回值返回。往往就时闭包了。理解闭包首先了解嵌套函数的词法作用域规则。

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;

posted @ 2018-05-03 11:21  tangjiao_Miya  阅读(120)  评论(0编辑  收藏  举报