js作用域及闭包

1,词法作用域:代码在编写过程中体现出来的作用范围,代码一旦写好,不用执行,作用域范围就已经确定好了。

2,js词法作用域:

函数允许访问函数外的数据

整个代码结构中只有函数可以限定作用域

作用规则首先使用提升规则分析

如果当前作用规则中有名字了,就不用考虑外面的名字

3,闭包

闭包的含义就是闭合,抱起来。简单的来说就是一个具有封闭功能与包裹功能的一个结构。所谓的闭包就是,有一个具有封闭的对外不公开的,包裹结构,或空间。

在js中函数可以构成闭包,一般函数就是一个代码结构的封闭结构,即包裹的特性,同时根据作用域规则,只允许函数访问外部的数据,外部无法访问函数内部的数据,即封闭的对外不公开的特性。因此说函数可以构成闭包。

4,闭包要解决什么问题

闭包不允许外界访问

要解决的问题就是间接访问该数据

函数就可以构成闭包,要解决的问题就是访问到函数内部的数据

eg:

function  foo( ){

     var  num=123;

     return  num;

}

var res=foo( );

console.log(res);//=>123

//这里的确是访问到函数中的数据了,但是该数据不能第二次访问,因为第二次访问的时候又要调用依稀foo,表示又有一个新的num=123出来了

//解决办法

function foo( ){

   var num=Math.random( );

   function  func( ){

        return  num;

     }

   return func;

}  

var f=foo( );

//f可以直接访问num

var res1=f( );

var res2=f( );


练习

function  foo( ){

  function   func( ){ }

  return  func;

}

foo( )//->结果是func

foo( )( )//->双圆括号,表示调用了func

**************************************************************************

如何获得超过一个数据

function foo(){

   var num1=MAth.random();

   var num2=MAth.random();

   return  {

          num1:function ( ){

                 return:num1

           },

          num2:function ( ){

               return:num2

          },

   }

}

如何完成读取一个数据和修改这个数据

function foo( ){

   var num=MAth.random();

   return{

   get_num:function( ){

       return num;

    },

    set_num:function(value ){

       num=value;

     }

  }

}

闭包 的基本用法

1,带有私有访问数据的对象

function Person( ){

    this.name='张三';

}

//所谓的私有数据,就是说只有函数内部可以访问的数据,或对象内部的方法可以访问的数据

function Person( ){

   var name=‘’;

   return{

   get_num:function( ){

       return name;

    },

    set_num:function(value ){

      if( value.charAt(0) )==='张'){     //->获取第一个字符

       name=value;

       }else{

         throw  new Error( ' 姓氏不对')

      }

     }

  }

}

2,带有私有数据的函数

var foo =(function ( ){

  //私有数据

   return function() {

  //可以使用私有的数据

    }

})( );

3,闭包的性能问题

函数执行需要内存,如果闭包引出的数据,还有变量引用的话,数据就不会回收,因此,在使用闭包的时候如果不使用某些数据了,一定要赋值一个null

猜你喜欢

转载自blog.csdn.net/L_AMiao/article/details/80819579