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

資訊專欄INFORMATION COLUMN

閉包

weizx / 2369人閱讀

摘要:而閉包的神奇之處在于可以阻止這件事情的發生。依然持有對該作用域的引用,而這個引用就叫做閉包。當然,無論使用何種方式對函數類型的值進行傳遞,當函數在別處被調用時都可以觀察到閉包。

下面我們來看一段代碼,清晰地展示了閉包:

function foo(){
    var a=2;
    function bar(){
        console.log(a);
    }
    return bar;
}
var baz=foo();
baz()     //2,這就是閉包

函數bar()的詞法作用域能夠訪問foo()的內部作用域,然后我們將bar()函數本身當作一個值類型進行傳遞。在這個例子中,我們將bar
所引用的函數對象本身當作返回值。
foo()執行后,其返回值(也就是內部的bar()函數)賦值給變量baz并調用baz(),實際上只是通過不同的標識符引用調用了內部的函數
baz().雖然baz()被正常執行,但是它是在自己定義的詞法作用域以外的地方執行。
由于存在引擎垃圾回收器來釋放不再使用的內存空間,由于看上去foo()的內容不會再被引用,所以很自然地會考慮對其進行回收。
而閉包的神奇之處在于可以阻止這件事情的發生。所以內部作用域依然存在,而且就是baz()本身在使用。
bar()依然持有對該作用域(foo())的引用,而這個引用就叫做閉包。
當然,無論使用何種方式對函數類型的值進行傳遞,當函數在別處被調用時都可以觀察到閉包。

function foo(){
    var a=2;
    function baz(){
        console.log(a);//2
    }
    bar(baz);
}
function bar(fn){
    fn();   //這就是閉包
}

把內部函數baz傳遞給bar,當調用這個內部函數是(現在叫做fn),它涵蓋的foo()內部作用域的閉包就可以觀察到了,因為他能夠訪問a。

傳遞的函數當然也可以是間接的:

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

所以無論通過何種手段將內部函數傳遞到所在的詞法作用域以外,它都會持有對原始定義作用域的引用,無論在何處執行這個函數都會使用閉包。

上面是為了可以解釋如何使用閉包而故意在結構上加了些許修飾,下面我們來看日常使用到的閉包。

function wait(message){
    setTimeout(function timer(){
        console.log(message);
    },1000);
}
wait("Hello,closure");

將一個內部函數(timer)傳遞給setTimeout(...).timer具有涵蓋wait()作用域的閉包,因此還保有對變量message的引用。
在引擎內部,內置的工具函數setTimeout()持有對一個參數的引用,這個參數也許叫做fn或者fnc,或者其他類似的名字。引擎會調用這個函數,
在例子中就是內部的timer函數,而詞法作用域在這個過程保持完整。

再來看一個jq的:

function setupBot(name,selector){
    $(selector).click(function activator(){
        console.log("Activating:"+name);
    });
}
setupBot("Closure Bot1","#bot_1");
setupBot("Closure Bot2","#bot_2");

本質上無論何時何地,如果將(訪問他們各自詞法作用域的)函數當作第一級的值類型并導出傳遞,你就會看到閉包在這些函數中的應用。在定時器、
事件監聽器、Ajax請求、跨窗口通信,Web Workers或者任何其他異步(或者同步)任務中,只要使用了回調函數,實際上就是在使用閉包!
(參考《你不知道的JavaSctipt上卷》)

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

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

相關文章

  • JS 中的閉包是什么?

    摘要:大名鼎鼎的閉包面試必問。閉包的作用是什么。看到閉包在哪了嗎閉包到底是什么五年前,我也被這個問題困擾,于是去搜了并總結下來。關于閉包的謠言閉包會造成內存泄露錯。閉包里面的變量明明就是我們需要的變量,憑什么說是內存泄露這個謠言是如何來的因為。 本文為饑人谷講師方方原創文章,首發于 前端學習指南。 大名鼎鼎的閉包!面試必問。請用自己的話簡述 什么是「閉包」。 「閉包」的作用是什么。 首先...

    Enlightenment 評論0 收藏0
  • 閉包,又見閉包。。。。?

    摘要:完美的閉包,對,閉包就這么簡單。這僅僅是閉包的一部分,閉包利用函數作用域達到了訪問外層變量的目的。此時一個完整的閉包實現了,的垃圾回收機制由于閉包的存在無法銷毀變量。 1.閉包是指有權訪問另一個函數作用域中的變量的函數。 上面這段話來自 javascript 高級程序設計 第三版 P178 。作者說閉包是一個函數,它有訪問另一個函數作用域中的變量的能力。 2.函數訪問它被創建時所處的...

    keelii 評論0 收藏0
  • 多層級理解閉包

    摘要:第二梯隊理解有了第一梯隊的認識,我們慢慢修正大腦中對閉包的認識。理解這句話就可以很好的與閉包這兩個字關聯起來理解閉包這個概念了。總結第二梯隊理解閉包是一個有特定功能的函數。第四梯隊理解閉包通過訪問外部變量,一個閉包可以維持這些變量。 閉包 閉包的概念困惑了我很久,記得當時我面試的時候最后一面有一個問題就是問題關于閉包的問題,然而到現在已經完全不記得當時的題目是啥了,但仍然能夠回憶起當時...

    nemo 評論0 收藏0
  • 面試官問我:什么是JavaScript閉包,我該如何回答

    摘要:到底什么是閉包這個問題在面試是時候經常都會被問,很多小白一聽就懵逼了,不知道如何回答好。上面這么說閉包是一種特殊的對象。閉包的注意事項通常,函數的作用域及其所有變量都會在函數執行結束后被銷毀。從而使用閉包模塊化代碼,減少全局變量的污染。 閉包,有人說它是一種設計理念,有人說所有的函數都是閉包。到底什么是閉包?這個問題在面試是時候經常都會被問,很多小白一聽就懵逼了,不知道如何回答好。這個...

    BenCHou 評論0 收藏0

發表評論

0條評論

weizx

|高級講師

TA的文章

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