閉包 是前端面試必問的一個(gè)知識(shí)點(diǎn)
one: 什么是閉包
two: 閉包的作用是什么
一、變量的作用域
全局變量 和 局部變量
在Js中函數(shù)內(nèi)部可以直接讀取 全局變量,而函數(shù)外部 自然無法讀取 函數(shù)內(nèi)部的局部變量
栗子1:
var name = 'itxing'; ?// name為全局變量
function getName() {
? ? console.log(name)
}
getName() ?//itxing
栗子2:
function getName() {
? ? var name = 'itxing'; ?// ?局部變量
}
console.log(name) ?//undefined
二、什么是閉包
MDN對(duì)其的理解
閉包是一個(gè)函數(shù),特指那些可以訪問獨(dú)立變量的函數(shù)(這種獨(dú)立變量在本地使用,但是卻定義在一個(gè)封閉的作用域),換句話說這類函數(shù)能夠記憶創(chuàng)建它們時(shí)的環(huán)境(很難理解)
栗子3:
function Person() {
? ? var name = 'itxing';
? ? function getName() {
? ? ? ? console.log(name)
? ? }
? ? return getName
}
var man = Person();
man() ?// ?'itxing'
函數(shù)getName能夠訪問函數(shù)Person內(nèi)部的變量,那么函數(shù)getName和變量name這整個(gè)環(huán)境就可以稱之為閉包。在這里man就成了一個(gè)閉包,這個(gè)閉包由getName()和字符串“itxing”組成。
閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)
三、閉包的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):延長(zhǎng)外部函數(shù)局部變量的生命周期
缺點(diǎn):容易造成內(nèi)存泄漏