zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    Bootstrap 网页1
    Bootstrap 网页实例
    Bootstrap 警告框
    Bootstrap 表格
    Bootstrap 小功能
    【BZOJ1706】[usaco2007 Nov]relays 奶牛接力跑 矩阵乘法
    【BZOJ3669】[Noi2014]魔法森林 LCT
    【BZOJ2049,2631,3282,1180】LCT模板四连A
    【BZOJ4071】[Apio2015]巴邻旁之桥 Treap
    【BZOJ1009】[HNOI2008]GT考试 next数组+矩阵乘法
  • 原文地址:https://www.cnblogs.com/tangjiao/p/8984474.html
Copyright © 2011-2022 走看看