1. 程式人生 > >js作用域及閉包

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