国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

作用域,作用域鏈,閉包

2024-04-27 15:18:19
字體:
來源:轉載
供稿:網友

閉包、作用域、作用域鏈

一 作用域,作用域鏈

先上代碼

復制代碼
1 var scope="global";  2 function t(){  3     console.log(scope);  4     var scope="local"  5     console.log(scope);  6 }  7 t();  復制代碼

此時打印出來的 按順序分別是undefine,local,為什么第一個是undefined呢,摘抄下js作用域原話:

javascript沒有塊級作用域,而是函數作用域.

所謂函數作用域就是說:-》變量在聲明它們的函數體以及這個函數體嵌套的任意函數體內都是有定義的。

所以此段代碼就可以解釋為:

復制代碼
var scope="global";   function t(){     var scope;      console.log(scope);       scope="local"       console.log(scope);   }   t();  復制代碼

所以明顯看出來第一句打印,只是重新聲明了變量,而沒有賦值

 

二 閉包與this

在閉包中使用this對象會出現一些問題,this對象是運行時基于函數的執行環境綁定的:在全局函數中,this等于window,而當函數被當作某個對象的方法調用時,this等于那個對象。不過,匿名函數的執行環境具有全局性,因此其this對象通常指向window(當然,在通過call()和apply()改變函數執行環境時,this指向其他對象)。

復制代碼
var name="The Window";      var object={      name:"My object",      getNameFunc:function(){          return function(){              return this.name;              };          }      };  alert(object.getNameFunc()()); //"The Window"(在非嚴格模式下)此時彈出  The Window復制代碼

如果要改變,那么我自己的理解就是讓閉包能 根據活動函數上下文找到 外部函數的變量,那么就把this重新賦值給一個變量

復制代碼
var name="The Window";      var object={      name:"My object",      getNameFunc:function(){      var that = this;        return function(){              return that.name;              };          }      };  alert(object.getNameFunc()()); //"The Window"(在非嚴格模式下)此時彈出  My object復制代碼

 

三 閉包的內存釋放與執行規則

直接上代碼

復制代碼
function fun03()        {            var a = 10;            return function(){                a*= 2 ;                return a ;            };        }          var f = fun03();        f();        var x = f();       console.log(x);  //40          var g = fun03();        var y = g();        console.log(y); //20 復制代碼

為什么第一句打印的是40,第二句打印20呢,目測看到的原因是第一句打印  f()執行了兩次(但是函數一旦執行后那么里面的局部變量就會銷毀,但是為什么沒有被銷毀呢,這就是閉包的作用)

因為閉包可以使變量不被釋放,始終存在內存中,因為fun03是其中匿名函數(閉包)的父函數,而匿名函數又被賦值給了一個全局變量,所以f一直在內存中,而f又依賴于fun03所以這就導致其中的a變量一直存在,當運行兩次后a進行了累加計算

結合垃圾回收機制來理解作用域鏈


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 湖南省| 合川市| 东乡族自治县| 星子县| 梁山县| 苏尼特左旗| 涞源县| 福贡县| 四子王旗| 监利县| 三都| 清镇市| 莎车县| 巩留县| 南部县| 郁南县| 离岛区| 高州市| 彰化市| 竹溪县| 防城港市| 军事| 德保县| 金沙县| 兴文县| 盘山县| 唐海县| 辉南县| 山西省| 内江市| 临朐县| 通河县| 博白县| 长兴县| 渭南市| 蛟河市| 泽普县| 林芝县| 林芝县| 自治县| 柳江县|