摘要:而閉包的神奇之處在于可以阻止這件事情的發(fā)生。依然持有對該作用域的引用,而這個引用就叫做閉包。當然,無論使用何種方式對函數(shù)類型的值進行傳遞,當函數(shù)在別處被調用時都可以觀察到閉包。
下面我們來看一段代碼,清晰地展示了閉包:
function foo(){ var a=2; function bar(){ console.log(a); } return bar; } var baz=foo(); baz() //2,這就是閉包
函數(shù)bar()的詞法作用域能夠訪問foo()的內部作用域,然后我們將bar()函數(shù)本身當作一個值類型進行傳遞。在這個例子中,我們將bar
所引用的函數(shù)對象本身當作返回值。
在foo()執(zhí)行后,其返回值(也就是內部的bar()函數(shù))賦值給變量baz并調用baz(),實際上只是通過不同的標識符引用調用了內部的函數(shù)
baz().雖然baz()被正常執(zhí)行,但是它是在自己定義的詞法作用域以外的地方執(zhí)行。
由于存在引擎垃圾回收器來釋放不再使用的內存空間,由于看上去foo()的內容不會再被引用,所以很自然地會考慮對其進行回收。
而閉包的神奇之處在于可以阻止這件事情的發(fā)生。所以內部作用域依然存在,而且就是baz()本身在使用。
bar()依然持有對該作用域(foo())的引用,而這個引用就叫做閉包。
當然,無論使用何種方式對函數(shù)類型的值進行傳遞,當函數(shù)在別處被調用時都可以觀察到閉包。
function foo(){ var a=2; function baz(){ console.log(a);//2 } bar(baz); } function bar(fn){ fn(); //這就是閉包 }
把內部函數(shù)baz傳遞給bar,當調用這個內部函數(shù)是(現(xiàn)在叫做fn),它涵蓋的foo()內部作用域的閉包就可以觀察到了,因為他能夠訪問a。
傳遞的函數(shù)當然也可以是間接的:
var fn; function foo(){ var a=2; function baz(){ console.log(a); } fn=baz; } function bar(){ fn(); } foo(); bar(); //2
所以無論通過何種手段將內部函數(shù)傳遞到所在的詞法作用域以外,它都會持有對原始定義作用域的引用,無論在何處執(zhí)行這個函數(shù)都會使用閉包。
上面是為了可以解釋如何使用閉包而故意在結構上加了些許修飾,下面我們來看日常使用到的閉包。
function wait(message){ setTimeout(function timer(){ console.log(message); },1000); } wait("Hello,closure");
將一個內部函數(shù)(timer)傳遞給setTimeout(...).timer具有涵蓋wait()作用域的閉包,因此還保有對變量message的引用。
在引擎內部,內置的工具函數(shù)setTimeout()持有對一個參數(shù)的引用,這個參數(shù)也許叫做fn或者fnc,或者其他類似的名字。引擎會調用這個函數(shù),
在例子中就是內部的timer函數(shù),而詞法作用域在這個過程保持完整。
再來看一個jq的:
function setupBot(name,selector){ $(selector).click(function activator(){ console.log("Activating:"+name); }); } setupBot("Closure Bot1","#bot_1"); setupBot("Closure Bot2","#bot_2");
本質上無論何時何地,如果將(訪問他們各自詞法作用域的)函數(shù)當作第一級的值類型并導出傳遞,你就會看到閉包在這些函數(shù)中的應用。在定時器、
事件監(jiān)聽器、Ajax請求、跨窗口通信,Web Workers或者任何其他異步(或者同步)任務中,只要使用了回調函數(shù),實際上就是在使用閉包!
(參考《你不知道的JavaSctipt上卷》)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/94924.html
摘要:大名鼎鼎的閉包面試必問。閉包的作用是什么??吹介]包在哪了嗎閉包到底是什么五年前,我也被這個問題困擾,于是去搜了并總結下來。關于閉包的謠言閉包會造成內存泄露錯。閉包里面的變量明明就是我們需要的變量,憑什么說是內存泄露這個謠言是如何來的因為。 本文為饑人谷講師方方原創(chuàng)文章,首發(fā)于 前端學習指南。 大名鼎鼎的閉包!面試必問。請用自己的話簡述 什么是「閉包」。 「閉包」的作用是什么。 首先...
摘要:完美的閉包,對,閉包就這么簡單。這僅僅是閉包的一部分,閉包利用函數(shù)作用域達到了訪問外層變量的目的。此時一個完整的閉包實現(xiàn)了,的垃圾回收機制由于閉包的存在無法銷毀變量。 1.閉包是指有權訪問另一個函數(shù)作用域中的變量的函數(shù)。 上面這段話來自 javascript 高級程序設計 第三版 P178 。作者說閉包是一個函數(shù),它有訪問另一個函數(shù)作用域中的變量的能力。 2.函數(shù)訪問它被創(chuàng)建時所處的...
摘要:到底什么是閉包這個問題在面試是時候經常都會被問,很多小白一聽就懵逼了,不知道如何回答好。上面這么說閉包是一種特殊的對象。閉包的注意事項通常,函數(shù)的作用域及其所有變量都會在函數(shù)執(zhí)行結束后被銷毀。從而使用閉包模塊化代碼,減少全局變量的污染。 閉包,有人說它是一種設計理念,有人說所有的函數(shù)都是閉包。到底什么是閉包?這個問題在面試是時候經常都會被問,很多小白一聽就懵逼了,不知道如何回答好。這個...
閱讀 1961·2023-04-26 02:14
閱讀 3862·2021-11-23 09:51
閱讀 1473·2021-10-13 09:39
閱讀 4056·2021-09-24 10:36
閱讀 3077·2021-09-22 15:55
閱讀 3598·2019-08-30 12:57
閱讀 2098·2019-08-29 15:30
閱讀 2052·2019-08-29 13:19