javascript對象---11 閉包

1、目的

1.閉包(closure) : 閉包的目的是 讀取 其餘函數內部變量,因爲正常函數執行後都會進行彈棧,從而再也不保存臨時變量,所以閉包 會使函數的臨時變量永久的保存在內存中。javascript

定義一個函數,函數內容執行過程,會把函數中變量放在堆內存,或棧內存中,一旦整個函數執行結束,棧內存彈出,堆內存等待垃圾回收,執行後沒法訪問臨時變量,而閉包能夠訪問臨時變量,java

2.經過內部函數才能訪問函數的變量,所以全部閉包的實現方式都是經過內部函數的方式實現。閉包

目的:讀取當前函數在執行過程當中的臨時變量的值函數

3.閉包會致使函數執行過程當中內存不會釋放,要注意使用場景與頻繁程度。spa

 

獲取函數臨時變量的值code

1. 用返回 return對象

<script>
            function fun(){
                var obj = {
                    name :"zhangsan"
                }
                return obj;
            }
            var a = fun();
            console.log(a);
</script>

2.  定義一個全局函數ip

function fun(){
                var obj = {
                    name :"zhangsan"
                };
                
        //此時inner至關於全局函數,至關於在window裏面加了一個inner屬性,
        //inner屬性對應的值爲 function, 返回當前臨時變量obj
                inner = function (){ 
                    return obj;
                }
                
            }; //fun()
            //第一步要先調用 fun()
            fun();     //已經加載 全局函數 inner()到 window環境;
            var ob =inner();
            console.log(ob.name);

經過在函數體內設置一個 全局function 獲取函數內臨時變量的值---全局變量函數,對局部變量對象 obj進行了引用,js識別 obj 被佔用-----就不會彈棧,因此每次執行inner時能夠訪問,------但形成obj不彈棧--不知道何時會調用,形成內存浪費內存

3.定義一個內部函數,並返回io

function fun(){
				var obj = {
					name :"zhangsan"
				};
		
				
				//對於當前內部函數來講 ret有訪問內部對象的權利
				function ret(){
					return obj;
				}
				return ret ; // ret沒加()表明當前返回的是函數對象
				
			};
			
			
			var ret = fun();  //ret自己是一個函數
			var obj = ret();
			console.log(obj)

經過內部函數返回,ret()方法內訪問obj對象,

var ret = fun();   //引用了 ret因此 ret 不會出棧  var obj = ret();

相關文章
相關標籤/搜索