摘要:而閉包的神奇之處在于可以阻止這件事情的發生。依然持有對該作用域的引用,而這個引用就叫做閉包。當然,無論使用何種方式對函數類型的值進行傳遞,當函數在別處被調用時都可以觀察到閉包。
下面我們來看一段代碼,清晰地展示了閉包:
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
摘要:大名鼎鼎的閉包面試必問。閉包的作用是什么。看到閉包在哪了嗎閉包到底是什么五年前,我也被這個問題困擾,于是去搜了并總結下來。關于閉包的謠言閉包會造成內存泄露錯。閉包里面的變量明明就是我們需要的變量,憑什么說是內存泄露這個謠言是如何來的因為。 本文為饑人谷講師方方原創文章,首發于 前端學習指南。 大名鼎鼎的閉包!面試必問。請用自己的話簡述 什么是「閉包」。 「閉包」的作用是什么。 首先...
摘要:完美的閉包,對,閉包就這么簡單。這僅僅是閉包的一部分,閉包利用函數作用域達到了訪問外層變量的目的。此時一個完整的閉包實現了,的垃圾回收機制由于閉包的存在無法銷毀變量。 1.閉包是指有權訪問另一個函數作用域中的變量的函數。 上面這段話來自 javascript 高級程序設計 第三版 P178 。作者說閉包是一個函數,它有訪問另一個函數作用域中的變量的能力。 2.函數訪問它被創建時所處的...
摘要:到底什么是閉包這個問題在面試是時候經常都會被問,很多小白一聽就懵逼了,不知道如何回答好。上面這么說閉包是一種特殊的對象。閉包的注意事項通常,函數的作用域及其所有變量都會在函數執行結束后被銷毀。從而使用閉包模塊化代碼,減少全局變量的污染。 閉包,有人說它是一種設計理念,有人說所有的函數都是閉包。到底什么是閉包?這個問題在面試是時候經常都會被問,很多小白一聽就懵逼了,不知道如何回答好。這個...
閱讀 1794·2023-04-26 02:14
閱讀 3719·2021-11-23 09:51
閱讀 1381·2021-10-13 09:39
閱讀 3963·2021-09-24 10:36
閱讀 3009·2021-09-22 15:55
閱讀 3511·2019-08-30 12:57
閱讀 2036·2019-08-29 15:30
閱讀 1980·2019-08-29 13:19