欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解JavaScript閉包問題

 更新時(shí)間:2021年06月30日 16:54:39   作者:qq_46186155  
這篇文章主要介紹了詳解JavaScript閉包問題,通過案例一步步進(jìn)行講解了該項(xiàng)技術(shù)問題,講述了變量的作用域,閉包的概念和作用,需要的朋友可以參考下

閉包是純函數(shù)式編程語言的傳統(tǒng)特性之一。通過將閉包視為核心語言構(gòu)件的組成部分,JavaScript語言展示了其與函數(shù)式編程語言的緊密聯(lián)系。由于能夠簡化復(fù)雜的操作,閉包在主流JavaScript庫以及高水平產(chǎn)品代碼中日益流行起來。

一、變量的作用域

在介紹閉包之前,我們先理解JavaScript的變量作用域。變量的作用域分為兩種:全局變量和局部變量。

1、全局變量

var n = 999; //全局變量

    function f1() {
        a = 100; //在這里a也是全局變量
        alert(n);
    }
    console.log(a); //100

在這里,函數(shù)內(nèi)外部可以直接取到變量的值——全局變量

2、局部變量

//局部變量
    function f2() {
        var b = 22;
    }
    console.log(b);   //報(bào)錯(cuò)

在這里,函數(shù)外部無法直接取到函數(shù)內(nèi)部定義的值——局部變量

講到這里,當(dāng)我們想要從外部取到局部變量的值,這時(shí)候該怎么辦呢?
請(qǐng)接著往下看:

二、如何從外部獲取局部變量

接下來我們看一個(gè)例子:

var outer = 'Outer'; // 全局變量
var copy; 
function outerFn(){ // 全局函數(shù)
 var inner = 'Inner'; // 該變量只有函數(shù)作用域,無法從外部訪問
 function innerFn(){ // outerFn()中的innerFn() 
 // 全局上下文和外圍上下文都可以在這里使用,
 // 因此可以訪問到outer和inner 
 console.log(outer); 
 console.log(inner); 
 } 
 copy=innerFn; // 保存innerFn()的引用
 // 因?yàn)閏opy是在全局上下文中聲明的,所以在外部可以使用
} 
outerFn(); 
copy(); // 不能直接調(diào)用innerFn(),但是可以通過在全局作用域中聲明的變量來調(diào)用

來分析一下上面的例子。在innerFn()中可以訪問變量outer,因?yàn)樗幱谌稚舷挛闹小?/span>

在執(zhí)行完outerFn()之后,執(zhí)行了innerFn(),這是通過將該函數(shù)的引用復(fù)制到一個(gè)全局變量
copy中來實(shí)現(xiàn)的。在利用變量copy調(diào)用函數(shù)innerFn()執(zhí)行時(shí),此刻已經(jīng)不在outerFn()的作
用域中了。因此下面的代碼不是應(yīng)該失敗嗎?
console.log(inner);
變量inner的值應(yīng)該是undefined吧?可是,上面代碼片段的輸出卻是:
“Outer”
“Inner”

這就是JavaScript的鏈?zhǔn)阶饔糜蚪Y(jié)構(gòu),子對(duì)象會(huì)一級(jí)一級(jí)的向上尋找所有父對(duì)象的變量。所以父對(duì)象的所有變量對(duì)子對(duì)象都是可見的,反之則不成立。

這樣我們就可以獲取到函數(shù)內(nèi)部的局部變量了。

三、閉包的概念

上面代碼塊中的copy()函數(shù)就是閉包。在我的理解,閉包就是能夠讀取到函數(shù)內(nèi)部變量的函數(shù)。
而在JavaScript中,可以通過函數(shù)內(nèi)部的子函數(shù)獲取到局部變量,因此可以把閉包理解為定義在函數(shù)內(nèi)部的函數(shù)。
可以把它理解為一個(gè)將函數(shù)內(nèi)部和外部連接起來的橋梁。

四、閉包的作用

在我看來,閉包的作用主要體現(xiàn)在兩個(gè)方面:

1、可以讀取函數(shù)內(nèi)部的變量

這個(gè)作用在上個(gè)代碼塊已經(jīng)表現(xiàn)得很清楚。

2、可以將局部變量的值一直保存在內(nèi)存中

總所周知,局部變量只有當(dāng)使用的時(shí)候才會(huì)在內(nèi)存中開辟出暫時(shí)的存儲(chǔ)空間,在函數(shù)運(yùn)行結(jié)束后會(huì)自動(dòng)釋放空間。而閉包的出現(xiàn)可以使得局部變量可以像全局變量一樣一致存儲(chǔ)在內(nèi)存中。

        function c1() {
            var z = 9999;
            nAdd = function() {
                z += 1;
            }

            function c2() {
                console.log(z);
            }
            return c2;
        }
        var result = c1();
        result(); //9999
        nAdd();
        result(); //10000

在上述代碼中,先執(zhí)行一次c1(),此時(shí)z=9999;再執(zhí)行一次nAdd(),使z+1;在執(zhí)行一次c1()輸出此時(shí)z的值,z=10000。說明z的值一直存儲(chǔ)在內(nèi)存中,并沒有在第一次調(diào)用c1()后背自動(dòng)消除。

此時(shí)就要注意,閉包的使用會(huì)消耗很大的內(nèi)存,不要濫用閉包。在退出函數(shù)之前,將不使用的局部變量全部刪除。

到此這篇關(guān)于詳解JavaScript閉包問題的文章就介紹到這了,更多相關(guān)JavaScript閉包問題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript 學(xué)習(xí)歷程和心得分享

    JavaScript 學(xué)習(xí)歷程和心得分享

    在過去,JavaScript只是被用來做一些簡單的網(wǎng)頁效果,比如表單驗(yàn)證、浮動(dòng)廣告等,所以那時(shí)候JavaScript并沒有受到重視。
    2010-12-12
  • Javascript入門學(xué)習(xí)第七篇 js dom實(shí)例操作

    Javascript入門學(xué)習(xí)第七篇 js dom實(shí)例操作

    上篇文章我們講了 用dom方式 創(chuàng)建節(jié)點(diǎn),復(fù)制節(jié)點(diǎn),插入節(jié)點(diǎn)。 今天我們將講 刪除節(jié)點(diǎn),替換節(jié)點(diǎn),查找節(jié)點(diǎn)等。
    2008-07-07
  • 淺談javascript中onbeforeunload與onunload事件

    淺談javascript中onbeforeunload與onunload事件

    javascript中onbeforeunload與onunload事件就是頁面加載前與頁面關(guān)閉時(shí)的兩個(gè)功能的函數(shù),可以防止頁面刷新時(shí)給提示再刷新或頁面關(guān)閉時(shí)給出提示,下面我來介紹onbeforeunload與onunload事件用法。
    2015-12-12
  • js格式化時(shí)間小結(jié)

    js格式化時(shí)間小結(jié)

    在項(xiàng)目中,我們經(jīng)常要遇到對(duì)日期時(shí)間進(jìn)行格式化,下面我們就來先小結(jié)一下各種時(shí)間格式化的方法,然后再通過實(shí)例來進(jìn)行分析
    2014-11-11
  • javascript 打開頁面window.location和window.open的區(qū)別

    javascript 打開頁面window.location和window.open的區(qū)別

    有時(shí)候需要用js來實(shí)現(xiàn)頁面的打開,因?yàn)閖s下有window.location和window.open的不同實(shí)現(xiàn)方法,下面來簡單的說明下區(qū)別。
    2010-03-03
  • javascript正則匹配漢字、數(shù)字、字母、下劃線

    javascript正則匹配漢字、數(shù)字、字母、下劃線

    javascript正則檢測(cè)只含有漢字、數(shù)字、字母、下劃線不能以下劃線開頭和結(jié)尾,需要的朋友可以參考下
    2014-04-04
  • JavaScript從原型到原型鏈深入理解

    JavaScript從原型到原型鏈深入理解

    這篇文章主要介紹了從原型與原型鏈開始講起,如果你想知道構(gòu)造函數(shù)的實(shí)例的原型,原型的原型,原型的原型的原型是什么,就來看看這篇文章吧。下面小編就來帶大家一起學(xué)習(xí)一下
    2019-06-06
  • jQuery入門問答 整理的幾個(gè)常見的初學(xué)者問題

    jQuery入門問答 整理的幾個(gè)常見的初學(xué)者問題

    大家可能看到了,我已經(jīng)將過去寫的兩篇jQuery的教程刪掉了,因?yàn)楦郊淮嬖诹说鹊葐栴},所以刪除了,從今天開始我就寫jQuery教程第二版了!希望大家能夠支持我!
    2010-02-02
  • Using the TextRange Object

    Using the TextRange Object

    Using the TextRange Object...
    2006-10-10
  • javaScript面向?qū)ο罄^承方法經(jīng)典實(shí)現(xiàn)

    javaScript面向?qū)ο罄^承方法經(jīng)典實(shí)現(xiàn)

    很多人都說JavaScript不能算是面向?qū)ο蟮淖兂烧Z言。但是JavaScript的類型非常松散,也沒有編譯器,但是我們可以模仿著其他語言實(shí)現(xiàn)面向?qū)ο蟮姆绞絹韺?shí)現(xiàn)JavaScript的面向編程
    2013-08-08

最新評(píng)論