小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

閉包理解

 印度阿三17 2021-03-12

閉包

剛學(xué)過(guò)的閉包,分享一下閉包的理解
1.什么是閉包?
閉包就是一個(gè)函數(shù),也可以說(shuō)閉包是一個(gè)引用關(guān)系,可以理解為一個(gè)作用域可以訪問(wèn)另一個(gè)函數(shù)的局部變量。
代碼:

function fn() {
var num = 10;
function fun() {
console.log(num);
}
fun();
}
fn();

函數(shù)調(diào)用后,運(yùn)行結(jié)果為10;
可以理解為 fun函數(shù)內(nèi)部作用域訪問(wèn)到了fn函數(shù)內(nèi)部的私有變量num,fn函數(shù)調(diào)用后,訪問(wèn)到了內(nèi)部的局部變量。
這就引出了閉包產(chǎn)生的條件。
2.閉包的產(chǎn)生條件?
a.函數(shù)的嵌套;
b.內(nèi)部函數(shù) 引用外部函數(shù)的局部變量;
c.調(diào)用外部函數(shù);
3.閉包的作用
a. 延長(zhǎng)外部函數(shù)變量對(duì)象的生命周期(也可以認(rèn)為延伸了變量的作用范圍);
b. 讓函數(shù)外部可以操作(讀寫(xiě))到函數(shù)內(nèi)部的數(shù)據(jù)(變量/函數(shù)),通過(guò)閉包間接的操作;
c.注意: 瀏覽器為了性能后期將外部函數(shù)中不被內(nèi)部函數(shù)使用的變量清除了;
一段代碼當(dāng)中 究竟存在幾套閉包機(jī)制 取決于外部函數(shù)調(diào)用了幾次

代碼塊一

  function fn() {
      var a = 0;
      function fn1() {
          a  ;
          console.log(a)
      }
      return fn1;
    }
     var f = fn();
    f();
    f();
    f();

解析:因?yàn)閒n函數(shù)只調(diào)用了一次,創(chuàng)建了一次執(zhí)行環(huán)境,后續(xù)的執(zhí)行全在這一次創(chuàng)建的執(zhí)行環(huán)境里,所以a ,也在原有的基礎(chǔ)上增加。
**所以輸出結(jié)果為 1,2,3;**閉包機(jī)制只有一套
代碼塊二

    function fn() {
      var a = 0;
      function fn1() {
          a  ;
          console.log(a)
      }
      return fn1;
      }
   fn();
   fn();
   fn();

    

解析:fn函數(shù)被調(diào)用了三次,每調(diào)用一次,就 創(chuàng)建一次新的執(zhí)行環(huán)境,執(zhí)行完成好進(jìn)行銷毀,所以每次調(diào)用a就從0開(kāi)始 ,所以輸出結(jié)果為1,1,1;閉包機(jī)制有三套
3.常見(jiàn)的閉包
a. 將函數(shù)作為另一個(gè)函數(shù)的返回值;
b. 將函數(shù)作為實(shí)參傳遞給另一個(gè)函數(shù)調(diào)用;
c. 使用閉包實(shí)現(xiàn)私有方法操作獨(dú)立的私有屬性;

看如下代碼

functionc fn(){
          var num =10;
          function fun(){
          console.log(num);
         }
         return fun;
}
var f = fn();
console.log(f);
console.log(f());

將函數(shù)作為另一個(gè)函數(shù)的返回值;
解析

var f =fn();
fn();//fn 運(yùn)行 返回值是fun函數(shù)
var f =function fun(){
   console.log(num);
}

所以console.log(f)打印出來(lái)的是 10
因?yàn)?fun函數(shù)沒(méi)有返回值,先運(yùn)行一遍fun函數(shù),再打印出fun函數(shù)的返回值;所以console.log(f());打印出來(lái)的值是 10,undefined

4.閉包的生命周期

1. 產(chǎn)生: 在嵌套內(nèi)部函數(shù)定義完時(shí)就產(chǎn)生了(不是在調(diào)用),外部函數(shù)調(diào)用的時(shí)候;
2. 死亡: 在嵌套的內(nèi)部函數(shù)成為垃圾對(duì)象時(shí);

5.閉包的缺點(diǎn)和解決(內(nèi)存泄漏和內(nèi)存溢出)

  1. 內(nèi)存泄漏 : 內(nèi)存無(wú)法釋放; 
    
  2. 內(nèi)存溢出 : 內(nèi)存被撐爆; 
    
  3. f = null;  解決方式;讓閉包機(jī)制清除,必須刪除外部函數(shù)調(diào)用的時(shí)候生成的(定義的那個(gè)對(duì)應(yīng)內(nèi)部函數(shù));
    

6.閉包面試題
代碼段1

var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function() {

return function() {
return this.name;
};
}
};
console.log(object.getNameFunc()());

解析

//解析
var f = object.getNameFunc();
var f = function() {
return this.name;
}
f();

function() {
return this.name;
}(); //相當(dāng)于立即執(zhí)行函數(shù) this指向的是window

此題沒(méi)有用到閉包
所以輸出結(jié)果為 The Window;
代碼段2

var name2 = "The Window";
var object2 = {
   name2: "My Object",
   getNameFunc: function () {
       var that = this;
       return function () {
           return that.name2;
       };
   }
};
console.log(object2.getNameFunc()());

解析
典型的一個(gè)作用域可以訪問(wèn)另一個(gè)函數(shù)的局部變量。是閉包
var that =this;
這個(gè)this指的調(diào)用者object2對(duì)象,所以that也是object2對(duì)象,所以that.name2指的是object2的name屬性。輸出結(jié)果為 My Object

來(lái)源:https://www./content-4-888501.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多