摘要:哈哈,簡單粗暴的理解,不過也對,這樣確實是形成了閉包。但有一個方法可以幫我們在外部調取內部的值,沒錯,這就是閉包我們先繼續看這道題,我將一步步解釋。第二點就是利用閉包的特點,增加某些的安全性。
(~ ̄(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);
結果是什么呢???
大家可以先自己想一下,然后來聽我分析(xiache)(#^.^#);
首先我們從for循環開始看起,循環了2次,分別執行了outputp[0]();outputp[1]();
首先outputp會執行return出一個數組,數組中有兩個方法,所以outputp[0]();outputp[1]();會執行數組中的兩個方法。
這里就涉及到閉包的知識點了~~~
第一次聽到閉包,別人給我的解釋就是,函數中輸出函數。
哈哈,簡單粗暴的理解,不過也對,這樣確實是形成了閉包。關于閉包,我們就要說到javascript的作用域,我們都知道,js中無非就是全局變量和局部變量。在js中,函數的內部都可以訪問的全局變量的值,但在函數外部無法獲取內部的值。但有一個方法可以幫我們在外部調取內部的值,沒錯,這就是閉包~~~
我們先繼續看這道題,我將一步步解釋。
這個是函數內部return函數,形成了閉包。所以我們在外部可以獲取到 x,y的值。沒錯也就是我們可以用outputp[0]();outputp[1]();來獲取,也就是會打印 7 7;
為什么可以
一般的函數,沒有return的時候,函數執行完成后也就會關閉了,但閉包會return出來一個函數,所以這個函數不能關閉,所以我們可以利用這個特性,這也就是我所認為的閉包。(萌新,否求指);
繼續看
最后的兩行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的值還在內存中,為什么訪問不到呢,因為我們之前說過,函數外部無法獲取內部的值,所以直接調用x是獲取不到的,閉包是利用outputp[0]()這種return出的函數調用其父的值x,y才獲取的到。
思考
閉包有什么用呢,本萌新在實戰中也用到過幾次,但畢竟經驗不足。這里就說兩點吧。
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); }
這個也是利用閉包的原理,函數內部可以看父親函數的值,因為父函數中有子函數,所以每次for循環i的值都在內存中,沒有變。
第二點就是利用閉包的特點,增加某些key的安全性。 比如有一個很重要的信息 “樓主可真是個小機靈鬼”,在一個函數內部,我們在外部想到用它,但不想任何人都可以隨便調到,因為這個信息很重要。這樣我們就可以這樣:
function getKey(){ var key = "樓主可真是個小機靈鬼"; return { _xxx : (function(){ return key; })() } }; console.log(getKey()._xxx)
key我們想自己全局的調用,但不想讓同事調用。_xxx可以是一個加密的字符串,我就可以這樣寫這樣我全局的都可以用到。
這就是本小白對閉包的理解,否佬指(不對的地方,麻煩大佬指出);
最后祝大家身體健康,謝謝~~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/53110.html
摘要:為了防止之后自己又開始模糊,所以自己來總結一下中關于作用域鏈和原型鏈的知識,并將二者相比較看待進一步加深理解。因此我們發現當多個作用域相互嵌套的時候,就形成了作用域鏈。原型鏈原型說完了作用域鏈,我們來講講原型鏈。 畢業也整整一年了,看著很多學弟都畢業了,忽然心中頗有感慨,時間一去不復還呀。記得從去年這個時候接觸到JavaScript,從一開始就很喜歡這門語言,當時迷迷糊糊看完了《J...
摘要:當初看這個解釋有點懵逼,理解成閉包就是函數中的函數了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學習語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數作為值返回的情況,被返回的函數引用了生成它的母函數中的變量。 本人開始接觸編程是從js開始的,當時網上很多人說閉包是難點,各種地方對閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發現不光是js,php、...
摘要:當初看這個解釋有點懵逼,理解成閉包就是函數中的函數了。里的閉包最近不滿足于只干前端的活,開始用起了。里的閉包最近在學習語言,讓我們來看一下語言里的閉包。在中,閉包特指將函數作為值返回的情況,被返回的函數引用了生成它的母函數中的變量。 本人開始接觸編程是從js開始的,當時網上很多人說閉包是難點,各種地方對閉包的解釋也是千奇百怪。如今開始接觸js以外的各種編程語言,發現不光是js,php、...
閱讀 1314·2021-09-27 13:56
閱讀 2346·2019-08-26 10:35
閱讀 3505·2019-08-23 15:53
閱讀 1855·2019-08-23 14:42
閱讀 1239·2019-08-23 14:33
閱讀 3572·2019-08-23 12:36
閱讀 1953·2019-08-22 18:46
閱讀 1006·2019-08-22 14:06