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

資訊專欄INFORMATION COLUMN

Js學習筆記:閉包

Crazy_Coder / 1917人閱讀

摘要:一前言這個周末,注意力都在學習基礎知識上面,剛好看到了閉包這個神圣的東西,所以打算把這兩天學到的總結下來,算是鞏固自己所學。因此要注意閉包的使用,否則會導致性能問題。五總結閉包的作用能夠讀取其他函數(shù)內部變量。

# 一、前言

這個周末,注意力都在學習基礎Js知識上面,剛好看到了閉包這個神圣的東西,所以打算把這兩天學到的總結下來,算是鞏固自己所學。也可能有些不正確的地方,也請大家看到了,麻煩在評論下提醒一下,算是互相學習了。

二、什么是閉包?
百度百科定義:閉包就是能夠讀取其他函數(shù)內部變量的函數(shù)。

在解釋之前,得先講講作用域。先來看下面這個示例:

var a = 1;
function f(){
  var b = 2;
  console.log(a) // 1
}
console.log(b) // undefined

示例中包含了兩種作用域,一種是屬于全局的全局作用域,另一種是屬于函數(shù)f的局部作用域。由于Javascript這種鏈式作用域(父作用域是可以被其子作用域訪問的,而子作用域卻不能被父作用域訪問)的機制,使得示例最后一行輸出了undefined

從此可以看出,無法從父作用域中訪問子作用域。而我們再來看閉包的定義:閉包就是能夠讀取其他函數(shù)內部變量的函數(shù)。也就是閉包可以讓我們從父作用域中訪問到子作用域,具體怎么實現(xiàn)的呢?來看這個經(jīng)典的例子:

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

var baz = foo();

baz(); // 2 -> 這就是閉包的效果

這個示例中,閉包就是函數(shù)bar??梢钥吹?,我們通過在函數(shù)foo內部定義其子函數(shù)bar,并將其作為foo返回值,因為bar函數(shù)作用域可以訪問foo的作用域,所以實現(xiàn)了從全局作用域訪問foo函數(shù)作用域的效果。

三、閉包的應用

其實,平時你所寫的代碼中,早就用到了閉包,只是你還沒發(fā)現(xiàn)而已。

本質上,無論何時何地,如果將函數(shù)當作值傳遞到其他地方使用(非函數(shù)所在作用域),你就已經(jīng)使用了閉包。例如上面示例說的函數(shù)bar,我們將他傳遞到了全局作用域下,通過這種方式訪問到本該不能訪問的變量a

在定時器、事件監(jiān)聽器、Ajax請求、任何其他異步(或同步)任務中,只要使用了回調函數(shù),實際上就是在使用閉包!

四、注意事項

閉包會讓他所在作用域中的變量始終保存在內存中,而不會被垃圾回收機制回收。

function foo(p){
    function bar(){
        console.log(++p);
    }
    return bar;
}

var baz = foo(1);
baz(); // 2
baz(); // 3
baz(); // 4

var bazz = foo(2);

bazz(); // 3
bazz(); // 4
bazz(); // 5

baz(); // 5

看到了沒,閉包的使用,函數(shù)調用之后,讓其外層函數(shù)的內部變量(foo函數(shù)內的變量)始終保存在了內存中,而不會被回收。

值得注意的是,每次調用一次foo,都會生成一個新的閉包,都會在內存中保存下其外層函數(shù)的內部變量。因此要注意閉包的使用,否則會導致性能問題。

五、總結

閉包的作用:

能夠讀取其他函數(shù)內部變量。

讓其他函數(shù)的內部變量始終保存在內存中。

參考:

阮一峰的Javascript入門教程——閉包

書籍:P43,你不知道的Javascript之閉包——上卷。

附:你不知道的Javascript系列電子書網(wǎng)盤鏈接, 密碼:i8jf

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

轉載請注明本文地址:http://systransis.cn/yun/97292.html

相關文章

  • JS學習筆記——閉包

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

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

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

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

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

    sunsmell 評論0 收藏0
  • JS筆記

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

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

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

    Tony_Zby 評論0 收藏0

發(fā)表評論

0條評論

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