一、什么是闭包
通俗一点来讲:A函数中包含B函数,在A函数执行完之后,B函数还保持着对A函数 变量对象 的引用,就叫做闭包。
如果实在要概括出来,之前有本书的一句话写的很好,我拿出来分享一下:
函数记住并认得它的词法作用域,当它在当前词法作用域之外执行时,闭包就产生了
举个例子:
function out() {
var a = 3;
function in() {
console.log(a);
}
}
var obj = out();
obj.in();
在这里,out函数运行之后,按照道理来说,a这个变量应该被当作垃圾回收了,但是in函数还保持着对它的引用,所以它不会被回收,这里就形成了一个闭包。
如果参照刚才系统的定义,in函数定义在out函数的词法作用域,但是它不在out函数的词法作用域中运行,所以满足闭包的条件。
二、闭包的应用
1. IIFE
立即执行函数表达式是用来避免变量污染的一个很重要的应用,但其实它并不很符合闭包的概念,因为函数还是依旧运行在定义的作用域里。
(function() {
//...
})()
2. 实现模块化
var module = function() {
var modules = {};
function define(name, deps, impl) {
for (var i = 0; i < deps.length; i++) {
deps[i] = modules[deps[i]];
}
modules[name] = impl.apply(impl, deps);
}
function get(name) {
return modules[name];
}
return {
define: define,
get: get
}
}
3. 防抖函数
function debounce(fn, delay) {
var timer;
return function() {
if(timer) {
clearTimeout(timer);
}
timer = setTimeout(function() {
fn.apply(this, arguments);
}, delay);
}
}
4. 节流函数
function throttle(fn, delay) {
var lastTime = 0;
return function() {
var now = +new Date();
if (now - lastTime > delay) {
lastTime = now;
fn.apply(this, arguments);
}
}
}
以上就是对于闭包的分析