成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS學(xué)習(xí)筆記——閉包

Karuru / 600人閱讀

摘要:什么是閉包定義我所理解的閉包就是,即使外部函數(shù)已經(jīng)運(yùn)行完畢,內(nèi)部函數(shù)仍能訪問外部函數(shù)的作用域中的變量。閉包的應(yīng)用場(chǎng)景私有變量模塊需求只能通過函數(shù)提供的方法訪問函數(shù)內(nèi)部的變量隱藏。為什么閉包很重要參考資料征服面試什么是閉包

1. 什么是閉包

MDN定義:Closures are functions that refer to independent (free) variables (variables that are used locally, but defined in an enclosing scope). In other words, these functions "remember" the environment in which they were created.

You Don"t Know JS: Closure is when a function is able to remember and access its lexical scope even when that function is executing outside its lexical scope.

我所理解的閉包就是,即使外部函數(shù)已經(jīng)運(yùn)行完畢,內(nèi)部函數(shù)仍能訪問外部函數(shù)的作用域中的變量。

抓重點(diǎn): 函數(shù), 作用域。
2. 閉包的運(yùn)行機(jī)制 2.1 詞法作用域查找規(guī)則

在閉包的使用中,為什么我們能夠通過閉包訪問外部函數(shù)的作用域中的變量?其一,詞法作用域的查找規(guī)則是“冒泡”的,即向外層一層層查找,直到全局作用域,所以能夠訪問外部函數(shù)的作用域。其二,函數(shù)的作用域是定義時(shí)所在的作用域,而不是運(yùn)行時(shí)的作用域。

function foo() {
  var a = 1;
  
  function bar() {
      console.log(a);
  }
 
 return bar;
}

var a = 2;
var baz = foo();
baz(); //1

在上面的代碼中,由于bar定義在foo的內(nèi)部,因此能夠向外“冒泡”訪問foo的作用域。當(dāng)運(yùn)行baz時(shí),a的值為1而不是2,也說明了函數(shù)的作用域是定義時(shí)的作用域,是靜態(tài)的。

2.2 垃圾回收 + 引用

當(dāng)函數(shù)執(zhí)行完畢后,引擎的垃圾回收機(jī)制會(huì)釋放不再使用的內(nèi)存空間。因此,當(dāng)外部函數(shù)執(zhí)行完畢時(shí),外部函數(shù)的內(nèi)部作用域理應(yīng)是該被銷毀的。然而,由于閉包存在對(duì)外部函數(shù)作用域的引用,因此此作用域仍然存在,所以內(nèi)部函數(shù)仍能在外部函數(shù)執(zhí)行結(jié)束之后訪問外部函數(shù)定義的變量,此之為“記住”

3. 閉包的應(yīng)用場(chǎng)景 3.1 私有變量 + 模塊

需求:只能通過函數(shù)提供的方法訪問函數(shù)內(nèi)部的變量——隱藏。只能內(nèi)部訪問——私有。

function bookInfo() {
  var book = {
        name: "You Don"t know JS",
      price: 66
    };
        
    function getPrice() {
        console.log(book.price);
    };
    
    function getName() {
        console.log(book.name);
    };
    
    function setPrice(price) {
        book.price = price;
    };
    
    return {
        getPrice,
      getName,
      setPrice
    };
  };

  var book = bookInfo();
  
  book.getPrice(); //66
  book.getName(); //"You Don"t know JS"
  book.setPrice(100);
  book.getPrice(); //100

在以上的代碼中,bookInfo通過返回一個(gè)對(duì)象,該對(duì)象的值是對(duì)內(nèi)部函數(shù)的引用,而不是對(duì)變量的引用。因此,實(shí)現(xiàn)了函數(shù)內(nèi)部變量是隱藏的(只能通過返回的對(duì)象方法訪問)且私有的(只有函數(shù)內(nèi)部才能訪問)。

在模塊中,返回的變量就被稱為模塊的公共API,模塊內(nèi)部的變量只能通過這些方法去使用。

3.2 偏函數(shù)應(yīng)用

需求:函數(shù)需要先接受一些參數(shù),隨后再接受另一些參數(shù)的時(shí)候。
比如,當(dāng)我計(jì)算商品的總價(jià)格時(shí),我想先設(shè)定商品的單價(jià),隨后根據(jù)購買數(shù)量算出總的商品價(jià)格。

  function partialApply(fn, ...fixedArgs) {
    return function (...remainingArgs) {
        return fn.apply(this, fixedArgs.concat(remainingArgs));
    }
  }
  
  function calTotalPrices(price, count) {
      console.log(price * count);
  }
  
  var pay = partialApply(calPrice, 10);
  
  pay(5);

在上面的代碼中,pay就是在partialApply的外部訪問了partialApply的內(nèi)部變量(函數(shù)參數(shù))。

4. 為什么閉包很重要? 參考資料

征服 JavaScript 面試:什么是閉包?| Eric Elliott

You Don"t know JavaScript

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/81448.html

相關(guān)文章

  • Js學(xué)習(xí)筆記閉包

    摘要:一前言這個(gè)周末,注意力都在學(xué)習(xí)基礎(chǔ)知識(shí)上面,剛好看到了閉包這個(gè)神圣的東西,所以打算把這兩天學(xué)到的總結(jié)下來,算是鞏固自己所學(xué)。因此要注意閉包的使用,否則會(huì)導(dǎo)致性能問題。五總結(jié)閉包的作用能夠讀取其他函數(shù)內(nèi)部變量。 # 一、前言 這個(gè)周末,注意力都在學(xué)習(xí)基礎(chǔ)Js知識(shí)上面,剛好看到了閉包這個(gè)神圣的東西,所以打算把這兩天學(xué)到的總結(jié)下來,算是鞏固自己所學(xué)。也可能有些不正確的地方,也請(qǐng)大家看到了,麻...

    Crazy_Coder 評(píng)論0 收藏0
  • JS學(xué)習(xí)筆記(第7章)(函數(shù)表達(dá)式)

    摘要:遞歸閉包模仿塊級(jí)作用域私有變量小結(jié)在編程中,使用函數(shù)表達(dá)式可以無需對(duì)函數(shù)命名,從而實(shí)現(xiàn)動(dòng)態(tài)編程。匿名函數(shù)也稱為拉姆達(dá)函數(shù)。函數(shù)聲明要求有名字,但函數(shù)表達(dá)式不需要。中的函數(shù)表達(dá)式和閉包都是極其有用的特性,利用它們可以實(shí)現(xiàn)很多功能。 1、遞歸 2、閉包 3、模仿塊級(jí)作用域 4、私有變量 5、小結(jié) 在JavaScript編程中,使用函數(shù)表達(dá)式可以無需對(duì)函數(shù)命名,從而實(shí)現(xiàn)動(dòng)態(tài)編程。匿名函數(shù)也稱...

    xiaokai 評(píng)論0 收藏0
  • [學(xué)習(xí)筆記] JavaScript 閉包

    摘要:但是,必須強(qiáng)調(diào),閉包是一個(gè)運(yùn)行期概念。通過原型鏈可以實(shí)現(xiàn)繼承,而與閉包相關(guān)的就是作用域鏈。常理來說,一個(gè)函數(shù)執(zhí)行完畢,其執(zhí)行環(huán)境的作用域鏈會(huì)被銷毀。所以此時(shí),的作用域鏈雖然銷毀了,但是其活動(dòng)對(duì)象仍在內(nèi)存中。 學(xué)習(xí)Javascript閉包(Closure)javascript的閉包JavaScript 閉包深入理解(closure)理解 Javascript 的閉包JavaScript ...

    sunsmell 評(píng)論0 收藏0
  • JS筆記

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁面加載發(fā)生了什么這是一篇開發(fā)的科普類文章,涉及到優(yōu)化等多個(gè)方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進(jìn)的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識(shí)之 HTTP 協(xié)議 詳細(xì)介紹 HTT...

    rottengeek 評(píng)論0 收藏0
  • js學(xué)習(xí)筆記閉包

    摘要:本實(shí)例來自語言精粹構(gòu)造器調(diào)用模式閉包變成了私有屬性當(dāng)函數(shù)返回時(shí),方法依然可以訪問,函數(shù)可以訪問他被創(chuàng)建時(shí)所處山下文環(huán)境,這就是閉包。 本實(shí)例來自《javascript語言精粹》 構(gòu)造器調(diào)用模式: var Quo = function(string){ this.status = string; }; Quo.prototype.get_status=function(){ ...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<