精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
閉包理解

閉包

剛學(xué)過的閉包,分享一下閉包的理解
1.什么是閉包?
閉包就是一個(gè)函數(shù),也可以說閉包是一個(gè)引用關(guān)系,可以理解為一個(gè)作用域可以訪問另一個(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)部作用域訪問到了fn函數(shù)內(nèi)部的私有變量num,fn函數(shù)調(diào)用后,訪問到了內(nèi)部的局部變量。
這就引出了閉包產(chǎn)生的條件。
2.閉包的產(chǎn)生條件?
a.函數(shù)的嵌套;
b.內(nèi)部函數(shù) 引用外部函數(shù)的局部變量;
c.調(diào)用外部函數(shù);
3.閉包的作用
a. 延長外部函數(shù)變量對象的生命周期(也可以認(rèn)為延伸了變量的作用范圍);
b. 讓函數(shù)外部可以操作(讀寫)到函數(shù)內(nèi)部的數(shù)據(jù)(變量/函數(shù)),通過閉包間接的操作;
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開始 ,所以輸出結(jié)果為1,1,1;閉包機(jī)制有三套
3.常見的閉包
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)打印出來的是 10
因?yàn)?fun函數(shù)沒有返回值,先運(yùn)行一遍fun函數(shù),再打印出fun函數(shù)的返回值;所以console.log(f());打印出來的值是 10,undefined

4.閉包的生命周期

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

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

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

此題沒有用到閉包
所以輸出結(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è)作用域可以訪問另一個(gè)函數(shù)的局部變量。是閉包
var that =this;
這個(gè)this指的調(diào)用者object2對象,所以that也是object2對象,所以that.name2指的是object2的name屬性。輸出結(jié)果為 My Object

來源:https://www.icode9.com/content-4-888501.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
js原型與原型鏈的詳細(xì)理解
學(xué)習(xí)網(wǎng)上閉包的小總結(jié)-2013-4-11
函數(shù)的兩種創(chuàng)建自定義方式
JavaScript 之 作用域
【原】理解javascript中的閉包
js中的this 詳解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

主站蜘蛛池模板: 临江市| 美姑县| 满城县| 天柱县| 建平县| 沈丘县| 离岛区| 珠海市| 武威市| 玛纳斯县| 遵义县| 孟村| 昌平区| 抚远县| 慈溪市| 诸暨市| 定远县| 龙游县| 金坛市| 阿荣旗| 晋城| 沽源县| 兴和县| 朝阳区| 昭苏县| 四会市| 莱西市| 绥中县| 久治县| 内江市| 莒南县| 文成县| 东城区| 海丰县| 绍兴县| 西乡县| 孝感市| 射阳县| 渭南市| 开封县| 乌拉特中旗|