定义
能够读取其他函数内变量的函数
本质
将函数内部和函数外部连接起来的桥梁
优点
- 能够读取其他函数内部的变量的值
- 能够让这些变量始终保持在内存中,不会被清除
什么是闭包(判定方法)
返回一个函数,并且这个函数对这个局部变量存在引用,
形成包含关系,可维持变量的状态,需要将函数赋值给全局变量,该全局定义的函数,则成为闭包
function f() {
var x = 1;
return function() {
return x++;
}
}
var f1 = f();
为啥要有闭包
局部变量不能长期保存,全局变量有会产生污染,闭包就应运而生了,它既能长期保存,也不会产生污染。他为啥能够长期保存呢?利用垃圾回收机制不回收全局变量的“漏洞”,
var f1 = f(); ,它便能够长期保存。就行jsonp一样,利用script标签不受同源政策的影响,他便能够实现非同源的访问。
应用1:通过一个变量维持一个状态的值
function f() {
var x = 0;
return function() {
return x++;
}
}
var a = f();
var b = f();
应用2: 利用闭包封装XMLHttpRequest
//闭包封装
function Http() {
var xhr = new XMLHttpRequest();
var _url = 'http://139.196.42.209:8001';
/*
methods 请求方式 get post
url 请求地址 /upload/list
data 传入的数据 一个对象
*/
return {
request: function (methods, url, data, success, error) {
xhr.open(methods, _url + url);
if (methods == 'get') {
xhr.send();
} else {
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify(data));
}
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
success(xhr.responseText);
} else if (xhr.status != 200) {
error(xhr.responseText.msg)
}
}
}
}
}
//调用
var http = Http();
http.request('get', '/upload/list', {}, function (res) {
console.log(res);
},
function (err) {
console.log(err);
})
}