摘要:一,理解閉包就要先理解作用域作用域在中作用域是由函數(shù)劃分的,所有屬于全局作用域的變量都是對(duì)象的屬性函數(shù)可以訪問(wèn)函數(shù),函數(shù)外不能訪問(wèn)函數(shù)里定義的變量,那么函數(shù)能訪問(wèn)函數(shù)里定義的變量那么可以將函數(shù)作為返回值,然后提供給外部作為接口,那么外部就能
一,理解閉包就要先理解作用域
作用域scope 在js中作用域scope是由函數(shù)劃分的,所有屬于全局作用域的變量都是window對(duì)象的屬性(prototype);
function A(){ var num =2; function B(){ console.log(num); } } //B函數(shù)可以訪問(wèn)A函數(shù),A函數(shù)外不能訪問(wèn)A函數(shù)里定義的變量,那么B函數(shù)能訪問(wèn)A函數(shù)里定義的變量; //那么可以將B函數(shù)作為返回值,然后提供給外部(作為接口),那么外部就能訪問(wèn)A函數(shù)里的變量了 //鏈?zhǔn)阶饔糜騝hain scope :子對(duì)象一級(jí)一級(jí)向父級(jí)對(duì)象尋找變量 var num = 2; var obj = { num :3, getNum :function (){ console.log(this.num) } } obj.getNum();//3 var n = 2; var obj = { n:3, getNum:function (){ setTimeout(console.log(this.n),3000); } } obj.getNum();//3 var n = 2; var obj = { n:3, getNum:funciton(){ setTimeout(function(){ console.log(this.n) },3000) } }; obj.getNum();//2二,閉包c(diǎn)losure:內(nèi)層的函數(shù)可以引用他外層函數(shù)內(nèi)的變量,即使外層的執(zhí)行已經(jīng)終止
//閉包的典型案例,實(shí)現(xiàn)訪問(wèn)函數(shù)內(nèi)部的變量 function people() { var name = "maoguotao"; function getname(){ console.log(name); } return getname; } var person = people(); person();
函數(shù)getName就是這個(gè)people函數(shù)的對(duì)外接口提供能夠訪問(wèn)到內(nèi)部定義的name,因此getName函數(shù)和變量name組成的環(huán)境就稱(chēng)之為閉包;
閉包的兩個(gè)特點(diǎn):1,可以訪問(wèn)函數(shù)內(nèi)部的變量,2,這些變量的值始終是保存在內(nèi)存中1.可以訪問(wèn)函數(shù)內(nèi)部的變量
function A(){ var name = "maoguotao"; this.getName = function () { console.log(name); } } var a = new A(); a.getName();
2.這些變量的值始終是保存在內(nèi)存中
function A(){ var name = "maoguotao"; addName = function (){ name = name + "12"; } function getName(){ console.log(name+"34"); } return getName; } var a = A(); a(); //maoguotao34 addName(); a(); //maoguotao1234
a函數(shù)執(zhí)行了兩次,也就是說(shuō)閉包getName函數(shù)執(zhí)行了兩次,實(shí)際上局部變量name是保存在內(nèi)存中的,并沒(méi)有在第一次的a()調(diào)用完之后清除,因?yàn)锳函數(shù)是getName閉包函數(shù)的父函數(shù),而getName函數(shù)被賦給a全局變量,使得getName函數(shù)始終在內(nèi)存中,而getName函數(shù)依賴(lài)于A函數(shù),所以A函數(shù)也是在內(nèi)存中,不會(huì)在調(diào)用結(jié)束后清除;
閉包的缺點(diǎn):
1,閉包使得函數(shù)中的變量保存在內(nèi)存中,對(duì)內(nèi)存消耗很大,不能濫用,會(huì)造成網(wǎng)頁(yè)的性能問(wèn)題,在IE中可能導(dǎo)致內(nèi)存的泄露,解決辦法就是在退出函數(shù)之前將使用的局部變量全部刪除;
2,閉包會(huì)在父函數(shù)外部,改變父函數(shù)的內(nèi)部變量的值,因此,把父函數(shù)當(dāng)作Object對(duì)象使用,把閉包當(dāng)作他的公用方法,把內(nèi)部變量當(dāng)作他的私有屬性;
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/89355.html
摘要:理解了這句話,我們就可以來(lái)看閉包了閉包前面說(shuō)過(guò),函數(shù)可以訪問(wèn)函數(shù)作用域鏈中的變量,但如果我們想在函數(shù)外訪問(wèn)函數(shù)內(nèi)卻不行了。 不管是閉包還是this關(guān)鍵字,都是困擾JS初學(xué)者的比較難懂的東西,如果你對(duì)它們的認(rèn)識(shí)還不足夠清晰,那么現(xiàn)在就一起把它們掌握掉。還是那句話,我們從最基本的開(kāi)始,建立起一個(gè)非常清晰的知識(shí)結(jié)構(gòu),好了,開(kāi)始吧 ? 閉包 當(dāng)然我們今天說(shuō)的是javascript里的閉包。要學(xué)...
摘要:在的開(kāi)發(fā)者工具中,通過(guò)斷點(diǎn)調(diào)試,我們能夠非常方便的一步一步的觀察的執(zhí)行過(guò)程,直觀感知函數(shù)調(diào)用棧,作用域鏈,變量對(duì)象,閉包,等關(guān)鍵信息的變化。其中表示當(dāng)前的局部變量對(duì)象,表示當(dāng)前作用域鏈中的閉包。 showImg(https://segmentfault.com/img/remote/1460000008404321); 在前端開(kāi)發(fā)中,有一個(gè)非常重要的技能,叫做斷點(diǎn)調(diào)試。 在chrome...
摘要:學(xué)習(xí),總繞不開(kāi)原型,原型鏈,繼承等等這些知識(shí)。對(duì)象那么好,怎么才能找一個(gè)呸,其實(shí)是創(chuàng)建創(chuàng)建對(duì)象的方法對(duì)象字面量工廠模式構(gòu)造函數(shù)模式原型模式等。原型鏈有什么用來(lái)談?wù)劺^承,繼承可以利用構(gòu)造函數(shù),使用屬性等來(lái)實(shí)現(xiàn)。 初學(xué)者學(xué)習(xí)javascript可能會(huì)感覺(jué)很困擾,但是你一旦真正了解了它,我相信你會(huì)愛(ài)上它。學(xué)習(xí)ECMAScript,總繞不開(kāi)原型,原型鏈,繼承等等這些知識(shí)。今天把它們放在一塊兒,...
摘要:然而學(xué)習(xí)布局,你只要學(xué)習(xí)幾個(gè)手機(jī)端頁(yè)面自適應(yīng)解決方案布局進(jìn)階版附源碼示例前端掘金一年前筆者寫(xiě)了一篇手機(jī)端頁(yè)面自適應(yīng)解決方案布局,意外受到很多朋友的關(guān)注和喜歡。 十分鐘學(xué)會(huì) Fiddler - 后端 - 掘金一.Fiddler介紹 Fiddler是一個(gè)http抓包改包工具,fiddle英文中有欺騙、偽造之意,與wireshark相比它更輕量級(jí),上手簡(jiǎn)單,因?yàn)橹荒茏ttp和https數(shù)據(jù)...
摘要:大名鼎鼎的閉包面試必問(wèn)。閉包的作用是什么。看到閉包在哪了嗎閉包到底是什么五年前,我也被這個(gè)問(wèn)題困擾,于是去搜了并總結(jié)下來(lái)。關(guān)于閉包的謠言閉包會(huì)造成內(nèi)存泄露錯(cuò)。閉包里面的變量明明就是我們需要的變量,憑什么說(shuō)是內(nèi)存泄露這個(gè)謠言是如何來(lái)的因?yàn)椤? 本文為饑人谷講師方方原創(chuàng)文章,首發(fā)于 前端學(xué)習(xí)指南。 大名鼎鼎的閉包!面試必問(wèn)。請(qǐng)用自己的話簡(jiǎn)述 什么是「閉包」。 「閉包」的作用是什么。 首先...
閱讀 2320·2021-11-08 13:13
閱讀 1250·2021-10-09 09:41
閱讀 1693·2021-09-02 15:40
閱讀 3193·2021-08-17 10:13
閱讀 2551·2019-08-29 16:33
閱讀 3126·2019-08-29 13:17
閱讀 3137·2019-08-29 11:00
閱讀 3301·2019-08-26 13:40