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

資訊專欄INFORMATION COLUMN

JavaScript中的閉包

wqj97 / 2771人閱讀

摘要:最準確地來解釋對的應用方法是詞法作用域的查找規則即在的函數作用域中無法找到則向上一級所嵌套的的作用域中查找,而這些規則只是閉包的一部分。而閉包的神奇之處可以阻止作用域被銷毀,被回收。

什么是閉包?

當函數可以記住并訪問所在的詞法作用域時,就產生了閉包,即使函數是在當前詞法作用域之外執行的
下面用一些代碼來解釋這個定義:

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

foo();

這是閉包嗎?
技術上來講,也許是。但根據前面的定義,確切地說并不是。最準確地來解釋 bar() 對 a 的應用方法是詞法作用域的查找規則(即在 bar() 的函數作用域中無法找到 a,則向上一級所嵌套的 foo() 的作用域中查找),而這些規則只是閉包的一部分。
下面再看一段代碼,清晰地展示了閉包:

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

var baz = foo();

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

函數 bar() 的詞法作用域能夠訪問 foo() 的內部作用域,然后將 bar() 函數本身作為一個值類型進行傳遞。在這段代碼中,我們將 bar 所引用的函數對象本身作為返回值。在 foo() 執行后,其返回值賦值給變量 baz 并調用 baz(),實際上只是通過不同的標識符引用調用了內部函數 bar()
在 foo() 執行后,通常會期待 foo() 的整個內部作用域都被銷毀。而閉包的神奇之處可以阻止作用域被銷毀,被回收。那么是誰再使用這個內部作用域?是 bar() 本身在使用。bar() 擁有覆蓋 foo() 內部作用域的閉包,使得該作用域能夠一直存活,以供 bar() 在之后任何時間進行引用。這個引用就叫做閉包。
再據兩個例子:

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

function bar(fn) {
    fn();   // 這就是閉包
}
function wait(message) {
    
    setTimeout(function timer(){
        console.log(message);
    },1000);
}

wait("Hello World");
循環和閉包

先看下面的例子:

for(var i=1; i<=5; i++){
    setTimeout(function timer() {
        console.log(i);
    },i*1000);
}

這段代碼在運行時會以每秒一次的頻率輸出五次6.為什么會這樣呢?
首先解釋6是怎么來的。這個循環的終止條件是 i<=5。條件首次成立時 i 的值是6.因此,輸出顯示的是循環結束時 i 的最終值。
延遲函數的回調會在循環結束時才執行,當定時器運行時即使每個迭代中執行的是 setTimeout(..,0),所有的回調函數依然是在勛魂結束后才會執行,因此每次都輸出6.根據作用域的工作原理,實際情況是盡管循環中的五個函數是在各個迭代中分別定義的,但是它們都是被封閉在一個共享的全局作用域中,因此實際上只有一個 i
再看下一個代碼,給上一代碼加入更多的詞法作用域,且要加入實質內容才能起作用。

for(var i=1; i<=5; i++){
    (function() {
        var j = i;
        setTimeout(function timer(){
            console.log(j);
        },j*1000)
    })();
}

現在就能正常分別輸出數字1~5,每秒一次,每次一個。

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

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

相關文章

  • JavaScript中的閉包

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

    HmyBmny 評論0 收藏0
  • JavaScript閉包,只學這篇就夠了

    摘要:當在中調用匿名函數時,它們用的都是同一個閉包,而且在這個閉包中使用了和的當前值的值為因為循環已經結束,的值為。最好將閉包當作是一個函數的入口創建的,而局部變量是被添加進這個閉包的。 閉包不是魔法 這篇文章使用一些簡單的代碼例子來解釋JavaScript閉包的概念,即使新手也可以輕松參透閉包的含義。 其實只要理解了核心概念,閉包并不是那么的難于理解。但是,網上充斥了太多學術性的文章,對于...

    CoderBear 評論0 收藏0
  • 還擔心面試官問閉包

    摘要:一言以蔽之,閉包,你就得掌握。當函數記住并訪問所在的詞法作用域,閉包就產生了。所以閉包才會得以實現。從技術上講,這就是閉包。執行后,他的內部作用域并不會消失,函數依然保持有作用域的閉包。 網上總結閉包的文章已經爛大街了,不敢說筆者這篇文章多么多么xxx,只是個人理解總結。各位看官瞅瞅就好,大神還希望多多指正。此篇文章總結與《JavaScript忍者秘籍》 《你不知道的JavaScri...

    tinyq 評論0 收藏0
  • JavaScript中的閉包

    摘要:權威指南第版中閉包的定義函數對象可以通過作用域鏈相互關聯起來,函數體內部的變量都可以保存在函數作用域內,這種特性在計算機科學文獻中成為閉包。循環中的閉包使用閉包時一種常見的錯誤情況是循環中的閉包,很多初學者都遇到了這個問題。 閉包簡介 閉包是JavaScript的重要特性,那么什么是閉包? 《JavaScript高級程序設計(第3版)》中閉包的定義: 閉包就是指有權訪問另一個函數中的變...

    Donne 評論0 收藏0
  • 深入javascript——作用域和閉包

    摘要:注意由于閉包會額外的附帶函數的作用域內部匿名函數攜帶外部函數的作用域,因此,閉包會比其它函數多占用些內存空間,過度的使用可能會導致內存占用的增加。 作用域和作用域鏈是javascript中非常重要的特性,對于他們的理解直接關系到對于整個javascript體系的理解,而閉包又是對作用域的延伸,也是在實際開發中經常使用的一個特性,實際上,不僅僅是javascript,在很多語言中都...

    oogh 評論0 收藏0
  • Javascript閉包入門(譯文)

    摘要:也許最好的理解是閉包總是在進入某個函數的時候被創建,而局部變量是被加入到這個閉包中。在函數內部的函數的內部聲明函數是可以的可以獲得不止一個層級的閉包。 前言 總括 :這篇文章使用有效的javascript代碼向程序員們解釋了閉包,大牛和功能型程序員請自行忽略。 譯者 :文章寫在2006年,可直到翻譯的21小時之前作者還在完善這篇文章,在Stackoverflow的How do Java...

    Fourierr 評論0 收藏0

發表評論

0條評論

wqj97

|高級講師

TA的文章

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