摘要:哈哈,簡單粗暴的理解,不過也對,這樣確實是形成了閉包。但有一個方法可以幫我們在外部調(diào)取內(nèi)部的值,沒錯,這就是閉包我們先繼續(xù)看這道題,我將一步步解釋。第二點就是利用閉包的特點,增加某些的安全性。
(~ ̄(OO) ̄)ブ,閉包,一個面試長問的問題,本白也迷糊了很久。慢慢不斷地有了自己的一點認識,這里分享一下~~~
廢話不多說,先看題:
var output = (function () { var x = y = 7; return [ function () { console.log(x) }, function () { console.log(y); } ] })(); for (var i = 0; i < 2; i++) { output[i](); } console.log(++y); console.log(++x);
結(jié)果是什么呢???
大家可以先自己想一下,然后來聽我分析(xiache)(#^.^#);
首先我們從for循環(huán)開始看起,循環(huán)了2次,分別執(zhí)行了outputp[0]();outputp[1]();
首先outputp會執(zhí)行return出一個數(shù)組,數(shù)組中有兩個方法,所以outputp[0]();outputp[1]();會執(zhí)行數(shù)組中的兩個方法。
這里就涉及到閉包的知識點了~~~
第一次聽到閉包,別人給我的解釋就是,函數(shù)中輸出函數(shù)。
哈哈,簡單粗暴的理解,不過也對,這樣確實是形成了閉包。關(guān)于閉包,我們就要說到j(luò)avascript的作用域,我們都知道,js中無非就是全局變量和局部變量。在js中,函數(shù)的內(nèi)部都可以訪問的全局變量的值,但在函數(shù)外部無法獲取內(nèi)部的值。但有一個方法可以幫我們在外部調(diào)取內(nèi)部的值,沒錯,這就是閉包~~~
我們先繼續(xù)看這道題,我將一步步解釋。
這個是函數(shù)內(nèi)部return函數(shù),形成了閉包。所以我們在外部可以獲取到 x,y的值。沒錯也就是我們可以用outputp[0]();outputp[1]();來獲取,也就是會打印 7 7;
為什么可以
一般的函數(shù),沒有return的時候,函數(shù)執(zhí)行完成后也就會關(guān)閉了,但閉包會return出來一個函數(shù),所以這個函數(shù)不能關(guān)閉,所以我們可以利用這個特性,這也就是我所認為的閉包。(萌新,否求指);
繼續(xù)看
最后的兩行console.log(++y);console.log(++x); 這里我們回到 var x = y = 7;
等用于 y = 7;var x = y; 所以,y其實是個全局變量。而x是局部變量。
console.log(++y) 會輸出8 因為全局變量在哪都可以訪問到
console.log(++x) 會報錯 Uncaught ReferenceError: x is not defined
有的同學可能要問,既然閉包 也就是x的值還在內(nèi)存中,為什么訪問不到呢,因為我們之前說過,函數(shù)外部無法獲取內(nèi)部的值,所以直接調(diào)用x是獲取不到的,閉包是利用outputp[0]()這種return出的函數(shù)調(diào)用其父的值x,y才獲取的到。
思考
閉包有什么用呢,本萌新在實戰(zhàn)中也用到過幾次,但畢竟經(jīng)驗不足。這里就說兩點吧。
for(var i = 0; i < 8;i++) { setTimeout(function(){ console.log(i) },500) }
這個會輸出 8 個 8,面試題考爛了的。 如何輸出0/1/2/3/4/5/6/7呢
只要將var i 變成 let i 就可以了。 如果不用es6語法怎么做呢? 這樣:
for (var i = 0; i < 8; i++) { (function(i){ setTimeout(function (){ console.log(i); },1000); })(i); }
這個也是利用閉包的原理,函數(shù)內(nèi)部可以看父親函數(shù)的值,因為父函數(shù)中有子函數(shù),所以每次for循環(huán)i的值都在內(nèi)存中,沒有變。
第二點就是利用閉包的特點,增加某些key的安全性。 比如有一個很重要的信息 “樓主可真是個小機靈鬼”,在一個函數(shù)內(nèi)部,我們在外部想到用它,但不想任何人都可以隨便調(diào)到,因為這個信息很重要。這樣我們就可以這樣:
function getKey(){ var key = "樓主可真是個小機靈鬼"; return { _xxx : (function(){ return key; })() } }; console.log(getKey()._xxx)
key我們想自己全局的調(diào)用,但不想讓同事調(diào)用。_xxx可以是一個加密的字符串,我就可以這樣寫這樣我全局的都可以用到。
這就是本小白對閉包的理解,否佬指(不對的地方,麻煩大佬指出);
最后祝大家身體健康,謝謝~~~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/98514.html
摘要:為了防止之后自己又開始模糊,所以自己來總結(jié)一下中關(guān)于作用域鏈和原型鏈的知識,并將二者相比較看待進一步加深理解。因此我們發(fā)現(xiàn)當多個作用域相互嵌套的時候,就形成了作用域鏈。原型鏈原型說完了作用域鏈,我們來講講原型鏈。 畢業(yè)也整整一年了,看著很多學弟都畢業(yè)了,忽然心中頗有感慨,時間一去不復還呀。記得從去年這個時候接觸到JavaScript,從一開始就很喜歡這門語言,當時迷迷糊糊看完了《J...
摘要:當初看這個解釋有點懵逼,理解成閉包就是函數(shù)中的函數(shù)了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學習語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數(shù)作為值返回的情況,被返回的函數(shù)引用了生成它的母函數(shù)中的變量。 本人開始接觸編程是從js開始的,當時網(wǎng)上很多人說閉包是難點,各種地方對閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發(fā)現(xiàn)不光是js,php、...
摘要:當初看這個解釋有點懵逼,理解成閉包就是函數(shù)中的函數(shù)了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學習語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數(shù)作為值返回的情況,被返回的函數(shù)引用了生成它的母函數(shù)中的變量。 本人開始接觸編程是從js開始的,當時網(wǎng)上很多人說閉包是難點,各種地方對閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發(fā)現(xiàn)不光是js,php、...
閱讀 1378·2021-09-24 10:26
閱讀 1689·2019-08-30 14:14
閱讀 2099·2019-08-29 16:54
閱讀 363·2019-08-29 14:09
閱讀 1468·2019-08-29 12:55
閱讀 922·2019-08-28 18:13
閱讀 1573·2019-08-26 13:39
閱讀 2560·2019-08-26 11:43