国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript之閉包

Mr_houzi / 454人閱讀

摘要:而閉包的妙處在于,當(dāng)函數(shù)在執(zhí)行完畢后它的活動(dòng)對(duì)象不會(huì)被銷(xiāo)毀,因?yàn)槟涿瘮?shù)的作用域鏈仍然在引用函數(shù)的活動(dòng)對(duì)象它的作用域鏈會(huì)被銷(xiāo)毀。

一、閉包

閉包是指有權(quán)訪(fǎng)問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)。
創(chuàng)建閉包的常用方式是,在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。

請(qǐng)看以下代碼:我們?cè)赾reateComparisonFunction函數(shù)里創(chuàng)建了一個(gè)閉包

function createComparisonFunction(propertyName) {
  return function(obj1, obj2) {
    var val1 = obj1[propertyName];
    var val2 = obj2[propertyName];
    if (val1 < val2) {    //若返回負(fù)數(shù),則第一個(gè)參數(shù)位于第二個(gè)參數(shù)之前
      return -1;
    } else if (val1 > val2) {    //若返回正數(shù),則第一個(gè)參數(shù)位于第二個(gè)參數(shù)之后
      return 1;
    } else {
      return 0;
    }
  };
}
//創(chuàng)建函數(shù)
var compareNames = createComparisonFunction("name");
//調(diào)用函數(shù)
var result = compareNames({ name: "Nicholas" }, { name: "Greg" });
當(dāng)某個(gè)函數(shù)第一次被調(diào)用時(shí),會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境(execution context)和相應(yīng)的作用域鏈,并把作用域鏈賦值給一個(gè)特殊的內(nèi)部屬性([[Scope]])。然后,使用thisarguments其他命名參數(shù)的值來(lái)初始化函數(shù)的活動(dòng)對(duì)象(activation object)。但在作用域鏈中,外部函數(shù)的活動(dòng)對(duì)象始終位于第二位,外部函數(shù)的外部函數(shù)的活動(dòng)對(duì)象處于第三位,……直至作為作用域鏈終點(diǎn)的全局執(zhí)行環(huán)境。

講這么多,其實(shí)就是下面這幅圖:

普通函數(shù)執(zhí)行完畢后,局部活動(dòng)對(duì)象就會(huì)被銷(xiāo)毀。
而閉包的妙處在于,當(dāng)createComparisonFunction()函數(shù)在執(zhí)行完畢后:

它的活動(dòng)對(duì)象不會(huì)被銷(xiāo)毀,因?yàn)?strong>匿名函數(shù)的作用域鏈仍然在引用createComparisonFunction()函數(shù)的活動(dòng)對(duì)象;

它的作用域鏈會(huì)被銷(xiāo)毀。

當(dāng)匿名函數(shù)都被銷(xiāo)毀之后,createComparisonFunction()函數(shù)的活動(dòng)對(duì)象才會(huì)被銷(xiāo)毀。所以,記得要解除對(duì)匿名函數(shù)的引用,以釋放內(nèi)存。

//解除對(duì)匿名函數(shù)的引用(以便釋放內(nèi)存)
compareNames = null;

對(duì)了,createComparisonFunction()函數(shù)還順便是個(gè)比較函數(shù),可用于sort

var data = [{ name: "Zah", age:20 }, { name:"Amy", age:30 }];
data.sort(createComparisonFunction("name"));
//data: 
//0: Object { name: "Amy", age: 30 }
//1: Object { name: "Zah", age: 20 }
data.sort(createComparisonFunction("age"));
//data: 
//0: Object { name: "Zah", age: 20 }
//1: Object { name: "Amy", age: 30 }
二、閉包中的this

this對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的:

在全局函數(shù)中,this等于window

當(dāng)函數(shù)作為某個(gè)對(duì)象的方法調(diào)用時(shí),this等于那個(gè)對(duì)象

匿名函數(shù)的執(zhí)行環(huán)境具有全局性,this通常等于window

請(qǐng)看以下代碼:

var name = "The Window";
var obj = {
  name: "My Obj",
  getNameFunc: function() {
    return function() {
      return this.name;
    };
  }
};
alert(obj.getNameFunc()()); //"The Window"(非嚴(yán)格模式下)


為啥不是"My Obj"?說(shuō)好的閉包能訪(fǎng)問(wèn)到外部作用域的變量值呢?
對(duì),這話(huà)是沒(méi)錯(cuò)的。但是,return的這個(gè)匿名函數(shù),沒(méi)有被修改過(guò)this,它的this對(duì)象依然指向window。當(dāng)沿著作用域鏈搜索this值的時(shí)候,先搜索到了自己的活動(dòng)對(duì)象的this值,便停止搜索,自然而然this等于window了。
講人話(huà)就是:先吃自己碗里的this。
那我就是想吃別人碗里的this怎么辦?(傲嬌.jpg)

var name = "The Window";
var obj = {
  name: "My Obj",
  getNameFunc: function() {
    var that = this;    //加一個(gè)變量that引用obj
    return function() {
      return that.name;
    };
  }
};
alert(obj.getNameFunc()()); //"My Obj"
三、模仿塊級(jí)作用域

我們一定遇到過(guò)這個(gè)問(wèn)題:

setTimeOut輸出1-10,一秒一個(gè)

最簡(jiǎn)單的方法當(dāng)然是:

for (let i = 0; i < 10; i++) {
  setTimeout(function() {
    alert(i);
  }, 1000*i);
}

那我偏要用閉包呢:

for (var i = 0; i < 10; i++) {
  (function(i) {
    setTimeout(function() {
      alert(i);
    }, 1000*i)
  })(i)
}

每次循環(huán)中,立即執(zhí)行匿名函數(shù),并傳入一個(gè)參數(shù)i。由于函數(shù)參數(shù)是按值傳遞的,所以就會(huì)把變量i的當(dāng)前值復(fù)制給參數(shù)i,從而輸出預(yù)期的i值。
而這個(gè)就是我們手動(dòng)模仿出來(lái)的塊級(jí)作用域(私有作用域):

  (function() {
    // 塊級(jí)作用域
  })()

將函數(shù)聲明包含在一對(duì)圓括號(hào)中,代表它是一個(gè)函數(shù)表達(dá)式。緊隨其后的圓括號(hào)會(huì)立即調(diào)用這個(gè)函數(shù)。因?yàn)镴avaScript將function關(guān)鍵字當(dāng)作一個(gè)函數(shù)聲明的開(kāi)始,函數(shù)聲明后面不能跟圓括號(hào),而函數(shù)表達(dá)式可以跟圓括號(hào)。

未完待續(xù)~若有不足,請(qǐng)多指教,不勝感激!

以上代碼借鑒于《Javascript高級(jí)程序設(shè)計(jì)》

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/104051.html

相關(guān)文章

  • JavaScript深入閉包

    摘要:深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。定義對(duì)閉包的定義為閉包是指那些能夠訪(fǎng)問(wèn)自由變量的函數(shù)。 JavaScript深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。 定義 MDN 對(duì)閉包的定義為: 閉包是指那些能夠訪(fǎng)問(wèn)自由變量的函數(shù)。 那什么是自由變量呢? 自由變量是指在函數(shù)中使用的,但既不是函數(shù)參數(shù)也...

    caige 評(píng)論0 收藏0
  • 【進(jìn)階2-3期】JavaScript深入閉包面試題解

    摘要:閉包面試題解由于作用域鏈機(jī)制的影響,閉包只能取得內(nèi)部函數(shù)的最后一個(gè)值,這引起的一個(gè)副作用就是如果內(nèi)部函數(shù)在一個(gè)循環(huán)中,那么變量的值始終為最后一個(gè)值。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開(kāi)始前端進(jìn)階的第二期,本周的主題是作用域閉包,今天是第8天。 本計(jì)劃一共28期,每期重點(diǎn)攻克一個(gè)面試重難點(diǎn),如果你還不了...

    alanoddsoff 評(píng)論0 收藏0
  • 【進(jìn)階2-2期】JavaScript深入從作用域鏈理解閉包

    摘要:使用上一篇文章的例子來(lái)說(shuō)明下自由變量進(jìn)階期深入淺出圖解作用域鏈和閉包訪(fǎng)問(wèn)外部的今天是今天是其中既不是參數(shù),也不是局部變量,所以是自由變量。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開(kāi)始前端進(jìn)階的第二期,本周的主題是作用域閉包,今天是第7天。 本計(jì)劃一共28期,每期重點(diǎn)攻克一個(gè)面試重難點(diǎn),如果你還不了解本進(jìn)階計(jì)...

    simpleapples 評(píng)論0 收藏0
  • 進(jìn)擊JavaScript(三)玩轉(zhuǎn)閉包

    摘要:為了更好的理解,在閱讀此文之前建議先閱讀上一篇進(jìn)擊之詞法作用域與作用域鏈?zhǔn)裁词情]包閉包的含義就是閉合,包起來(lái),簡(jiǎn)單的來(lái)說(shuō),就是一個(gè)具有封閉功能與包裹功能的結(jié)構(gòu)。在中函數(shù)構(gòu)成閉包。 為了更好的理解,在閱讀此文之前建議先閱讀上一篇《進(jìn)擊JavaScript之詞法作用域與作用域鏈》 1.什么是閉包 閉包的含義就是閉合,包起來(lái),簡(jiǎn)單的來(lái)說(shuō),就是一個(gè)具有封閉功能與包裹功能的結(jié)構(gòu)。所謂的閉包就是...

    cyixlq 評(píng)論0 收藏0
  • 【譯】理解JavaScript閉包

    摘要:當(dāng)面試中讓我解釋一下閉包時(shí)我懵逼了。這個(gè)解釋開(kāi)始可能有點(diǎn)晦澀,讓我們抽絲剝繭摘下閉包的真面目。此文不詳述作用域有專(zhuān)門(mén)的主題闡述,不過(guò)作用域是理解閉包原理的基礎(chǔ)。這才是閉包的真正便利之處。閉包使用不當(dāng)就會(huì)很坑。 原文鏈接 為什么深度學(xué)習(xí)JavaScript? JavaScript如今是最流行的編程語(yǔ)言之一。它運(yùn)行在瀏覽器、服務(wù)器、移動(dòng)設(shè)備、桌面應(yīng)用,也可能包括冰箱。無(wú)需我舉其他再多不相干...

    岳光 評(píng)論0 收藏0
  • 【前端工程師手冊(cè)】JavaScript閉包

    摘要:閉包確實(shí)是一個(gè)說(shuō)爛了的概念,校招社招都會(huì)被問(wèn)到,今天總結(jié)一番。先下定義,閉包是函數(shù)和該函數(shù)的詞法作用域的組合。在這個(gè)栗子里,函數(shù)以及它對(duì)變量的引用就構(gòu)成了閉包。閉包和作用域?qū)τ陂]包和作用域的關(guān)系,我的理解是閉包其實(shí)就是作用域的延伸。 閉包確實(shí)是一個(gè)說(shuō)爛了的概念,校招社招都會(huì)被問(wèn)到,今天總結(jié)一番。先下定義,閉包是函數(shù)和該函數(shù)的詞法作用域的組合。其實(shí)這個(gè)定義是比較教條的,可以直白的理解為閉...

    CarlBenjamin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<