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

資訊專欄INFORMATION COLUMN

JS學習筆記——閉包

Karuru / 598人閱讀

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

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.

我所理解的閉包就是,即使外部函數已經運行完畢,內部函數仍能訪問外部函數的作用域中的變量。

抓重點: 函數, 作用域。
2. 閉包的運行機制 2.1 詞法作用域查找規則

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

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

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

在上面的代碼中,由于bar定義在foo的內部,因此能夠向外“冒泡”訪問foo的作用域。當運行baz時,a的值為1而不是2,也說明了函數的作用域是定義時的作用域,是靜態的。

2.2 垃圾回收 + 引用

當函數執行完畢后,引擎的垃圾回收機制會釋放不再使用的內存空間。因此,當外部函數執行完畢時,外部函數的內部作用域理應是該被銷毀的。然而,由于閉包存在對外部函數作用域的引用,因此此作用域仍然存在,所以內部函數仍能在外部函數執行結束之后訪問外部函數定義的變量,此之為“記住”

3. 閉包的應用場景 3.1 私有變量 + 模塊

需求:只能通過函數提供的方法訪問函數內部的變量——隱藏。只能內部訪問——私有。

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通過返回一個對象,該對象的值是對內部函數的引用,而不是對變量的引用。因此,實現了函數內部變量是隱藏的(只能通過返回的對象方法訪問)且私有的(只有函數內部才能訪問)。

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

3.2 偏函數應用

需求:函數需要先接受一些參數,隨后再接受另一些參數的時候。
比如,當我計算商品的總價格時,我想先設定商品的單價,隨后根據購買數量算出總的商品價格。

  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的內部變量(函數參數)。

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

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

You Don"t know JavaScript

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/81448.html

相關文章

  • Js學習筆記閉包

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

    Crazy_Coder 評論0 收藏0
  • JS學習筆記(第7章)(函數表達式)

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

    xiaokai 評論0 收藏0
  • [學習筆記] JavaScript 閉包

    摘要:但是,必須強調,閉包是一個運行期概念。通過原型鏈可以實現繼承,而與閉包相關的就是作用域鏈。常理來說,一個函數執行完畢,其執行環境的作用域鏈會被銷毀。所以此時,的作用域鏈雖然銷毀了,但是其活動對象仍在內存中。 學習Javascript閉包(Closure)javascript的閉包JavaScript 閉包深入理解(closure)理解 Javascript 的閉包JavaScript ...

    sunsmell 評論0 收藏0
  • JS筆記

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

    rottengeek 評論0 收藏0
  • js學習筆記閉包

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

    Tony_Zby 評論0 收藏0

發表評論

0條評論

Karuru

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<