成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

js閉包的理解

EasonTyler / 3515人閱讀

摘要:一般來講,函數(shù)執(zhí)行完畢后,局部活動對象就會被銷毀,內(nèi)存中僅保存全局作用域,但是閉包的情況有所不同理解閉包的前提先理解另外兩個內(nèi)容作用域鏈垃圾回收作用域鏈當代碼在執(zhí)行過程中,會創(chuàng)建變量對象的一個作用域鏈。

閉包是javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包來實現(xiàn)。個人的理解是:函數(shù)中嵌套函數(shù)。

閉包的定義及其優(yōu)缺點

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

閉包的缺點是常駐內(nèi)存,會增大內(nèi)存的使用量,使用不當會造成內(nèi)存泄漏。

應用閉包主要是為了:設計私有變量和方法。

一般來講,函數(shù)執(zhí)行完畢后,局部活動對象就會被銷毀,內(nèi)存中僅保存全局作用域,但是閉包的情況有所不同!

理解閉包的前提先理解另外兩個內(nèi)容:作用域鏈、垃圾回收

作用域鏈:當代碼在執(zhí)行過程中,會創(chuàng)建變量對象的一個作用域鏈。作用域鏈的用途,是保證對執(zhí)行環(huán)境有權訪問的所有變量和函數(shù)的有序訪問。
請看下面的一段代碼:

//全局環(huán)境中有一個變量color和一個函數(shù)changeColor()
 var color = "blue";
        //changeColor()的局部環(huán)境中有一個anotherColor變量和swapColors()函數(shù)
        function changeColor() {
            var anotherColor = "red";
            //swapColors()環(huán)境中只有一個tempColor
            function swapColors() {
                var tempColor = anotherColor;
                anotherColor = color;
                color = tempColor;
            }
            swapColors();
        }

        changeColor();

全局環(huán)境只能訪問到變量color
changeColor()局部環(huán)境也可以訪問color
swapColors()可以訪問其他兩個環(huán)境的所有變量,但是那兩個變量都無權訪問tempColor

總結:內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境,但外部環(huán)境不能訪問內(nèi)部環(huán)境中的任何變量和函數(shù)。每個環(huán)境都可以向上搜索作用域鏈,但任何環(huán)境都不能向下搜索作用域鏈而進入另一個執(zhí)行環(huán)境。

垃圾回收原理

(1)javascript中如果一個對象不再被引用,那么這個對象就會被回收。
(2)如果兩個對象互相引用,而不再被第3者引用,那么這兩個互相引用的對象也會被回收。

嵌套函數(shù)的閉包

var f = function () {
            var a = 9999;
            function f1() {
                alert(a);
            }
            f1();
        };
        f();

函數(shù)嵌套時候,在f執(zhí)行完成之后,變量a還要被f1這個內(nèi)部嵌套的函數(shù)繼續(xù)使用,因此a不會被釋放。js解析器發(fā)現(xiàn)函數(shù)中嵌套了函數(shù)時,就會把函數(shù)中的變量和子函數(shù)的變量一起保存,構成了一個“閉包”。這些變量不會被內(nèi)存回收器回收,只有當內(nèi)部嵌套的函數(shù)不在執(zhí)行后,才會被回收。

閉包的特性和使用閉包的好處

閉包有三個特性:
1.函數(shù)嵌套函數(shù)
2.函數(shù)內(nèi)部可以引用外部的參數(shù)和變量
3.參數(shù)和變量不會被垃圾回收機制回收

使用閉包的好處:
1.希望一個變量長期駐扎內(nèi)存
2.避免全局變量污染
3.私有成員變量的存在

閉包案例

屬性

var person = function () {
            var name = "kimi";
            this.getName = function () {
                return name;
            };

        };
        var p = new person();
        alert(p.getName());

name屬性通過getName方法獲取到。

在循環(huán)中直接找到對應元素的索引





    
    
    



    
  • a
  • b
  • c
  • d

執(zhí)行以上代碼發(fā)現(xiàn)點擊任何一個返回的都是4,這是因為賦值的時候,傳的i是對內(nèi)存地址的引用,循環(huán)結束,i指向的就是4.

使用閉包改寫上面的代碼





    
    閉包
    



    
  • a
  • b
  • c
  • d

每一次循環(huán)的時候,都把當前的i通過立即執(zhí)行函數(shù)賦值。

變量的累加

全局變量的累加

 

局部變量的累加

 

上述代碼沒有實現(xiàn)累加,改寫代碼如下:


模塊化代碼,減少全局變量的污染

this對象

在閉包中使用this對象可能導致一些問題


代碼先創(chuàng)建了一個全局變量name,又創(chuàng)建了一個包含name屬性的對象。這個對象還包含一個getNameFunc()方法,返回一個匿名函數(shù),匿名函數(shù)又返回一個this.name。調(diào)用object.getNameFunc()()返回一個字符串。內(nèi)部函數(shù)搜索的時候只搜索到活動對象。


在定義匿名函數(shù)前,把this對象賦值給that變量,閉包也可以訪問這個變量。即使函數(shù)返回,仍然引用著object

學習了閉包也不知道到底哪里用到,到底有什么用?;卮穑?其實你寫的每一個js函數(shù)都是閉包,一個js函數(shù)的頂層作用域就是window對象,js的執(zhí)行環(huán)境本身就是一個scope(瀏覽器的window/node的global),我們通常稱之為全局作用域。每個函數(shù),不論多深,都可以認為是全局scope的子作用域,可以理解為閉包。)

本篇文章是自己學習過程中的總結,如有錯誤歡迎指正。

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/82442.html

相關文章

  • 談談我所理解閉包js、php、golang里closure

    摘要:當初看這個解釋有點懵逼,理解成閉包就是函數(shù)中的函數(shù)了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學習語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數(shù)作為值返回的情況,被返回的函數(shù)引用了生成它的母函數(shù)中的變量。 本人開始接觸編程是從js開始的,當時網(wǎng)上很多人說閉包是難點,各種地方對閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發(fā)現(xiàn)不光是js,php、...

    betacat 評論0 收藏0
  • 談談我所理解閉包js、php、golang里closure

    摘要:當初看這個解釋有點懵逼,理解成閉包就是函數(shù)中的函數(shù)了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學習語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數(shù)作為值返回的情況,被返回的函數(shù)引用了生成它的母函數(shù)中的變量。 本人開始接觸編程是從js開始的,當時網(wǎng)上很多人說閉包是難點,各種地方對閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發(fā)現(xiàn)不光是js,php、...

    zhoutao 評論0 收藏0
  • 理解 JavaScript 閉包

    摘要:如何在初學就理解閉包你需要接著讀下去。這樣定義閉包是函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合。小結閉包在中隨處可見。閉包是中的精華部分,理解它需要具備一定的作用域執(zhí)行棧的知識。 這是本系列的第 4 篇文章。 作為 JS 初學者,第一次接觸閉包的概念是因為寫出了類似下面的代碼: for (var i = 0; i < helpText.length; i++) { var item = he...

    寵來也 評論0 收藏0
  • JavaScript中閉包

    摘要:閉包引起的內(nèi)存泄漏總結從理論的角度將由于作用域鏈的特性中所有函數(shù)都是閉包但是從應用的角度來說只有當函數(shù)以返回值返回或者當函數(shù)以參數(shù)形式使用或者當函數(shù)中自由變量在函數(shù)外被引用時才能成為明確意義上的閉包。 文章同步到github js的閉包概念幾乎是任何面試官都會問的問題,最近把閉包這塊的概念梳理了一下,記錄成以下文章。 什么是閉包 我先列出一些官方及經(jīng)典書籍等書中給出的概念,這些概念雖然...

    HmyBmny 評論0 收藏0
  • js 變量提升和閉包理解

    摘要:變量的作用域無非就是兩種全局變量和局部變量。其中內(nèi)部函數(shù)中可以訪問外部函數(shù)的變量,是因為內(nèi)部函數(shù)的作用域鏈中包含了外部函數(shù)的作用域也可以理解為內(nèi)部函數(shù)的作用范圍輻射到了外部函數(shù)的作用范圍另一方面,在函數(shù)外部自然無法讀取函數(shù)內(nèi)的局部變量。 以前學習的時候,了解過變量提升和閉包,但是沒有深入了解,網(wǎng)上查了資料,這里記錄下,只供參考。部分內(nèi)容引用: https://www.cnblogs.c...

    luoyibu 評論0 收藏0

發(fā)表評論

0條評論

EasonTyler

|高級講師

TA的文章

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