千鋒教育JavaScript全套視頻教程(10天學(xué)會Js,前端javascrip

概念:閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)
語法:function fn(){
? ? ? ? ? ? // 屬于fn函數(shù)的私有變量
? ? ? ? ? ? let a = 10
? ? ? ? ? ? // 把這個a返回給外界,但是是通過函數(shù)返回的
? ? ? ? ? ? return function(){
? ? ? ? ? ? ? ? // 使用了fn函數(shù)的私有變量
? ? ? ? ? ? ? ? console.log(a)
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? // 在外界使用變量接收了返回出來的函數(shù)
? ? ? ? let res = fn()
? ? ? ? res()
閉包面試題:function fun(n, o) {
? ? ? ? ? ? console.log(o)
? ? ? ? ? ? const obj = {
? ? ? ? ? ? ? ? fun: function (m) {
? ? ? ? ? ? ? ? ? ? return fun(m, n)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? return obj
? ? ? ? }
? ? ? ? var res = fun(0) // 執(zhí)行是全局的fun ?n = 0 ?o ? // undefined
? ? ? ? ? ? ? ? ? ? ? ? // res 就是obj這個對象 ? ?執(zhí)行的時候 形成了閉包 ?n 變量緩存起來了 n = 0
? ? ? ? ? ? ? ? ? ? ? ? ?// 執(zhí)行空間1
? ? ? ? // ? ?console.log(res) ? ? ? ? ? ?
? ? ? ? res.fun(1) ?// fun 就是對象里面的fun ?m = 1
? ? ? ? ? ? ? ? ? ? // ?里面會執(zhí)行 return ?fun(m,n) 執(zhí)行就是全局的fun(1,0)
? ? ? ? ? ? ? ? ? ? // 打印 0
? ? ? ? ? ? ? ? ? ? // 執(zhí)行空間2 ? n = 1
? ? ? ? res.fun(2) ?// fun ?就是對象里面 fun ?m = 2 ?
? ? ? ? ? ? ? ? ? ? // ?里面會執(zhí)行 return ?fun(m,n) 執(zhí)行就是全局的fun(2,0)
? ? ? ? ? ? ? ? ? ? // 執(zhí)行空間3
? ? ? ? res.fun(3)
? ? ? ? // var b = fun(0).fun(1).fun(2).fun(3)
? ? ? ? // ? ?var ?res ?= fun(0) ? // undefined ? // ?執(zhí)行空間1 ? n = 0
? ? ? ? // ? ?var ?res1 = ?res.fun(1) // ===> fun(0).fun(1) ? ?// ?0 ? ?執(zhí)行空間2 ?n = 1
? ? ? ? // ? ?var ?res2 = ?res1.fun(2) // ?== fun(0).fun(1).fun(2) ? // 打印1 ?執(zhí)行空間3 ?n= 2
? ? ? ? var c = fun(0).fun(1) ?// undefined ? 0
? ? ? ? // c.fun(2) ? ?// ?1
? ? ? ? // c.fun(3) ? ?// 1