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