一、函数回调
1.什么是函数回调
将一个函数作为另一个函数的参数传入
2.实例
function callback(data) {
console.log(data);
}
function func(callback) {
var data = [1,2,3,4,5];
callback(data);
}
func(callback);
二、闭包函数
1.什么是闭包函数
函数的嵌套定义,内层函数就是闭包
案例
function a_fn() {
var data = [1,2,3,4,5];
function b_fn() {
console.log(data);
}
b_fn();
}
a_fn();
2.为什么会产生闭包
function fu() {
var a = 10;//局部变量
}
console.log(a)//报错
在外部使用局部变量的方法:
- 函数回调
- 闭包
- 返回值
- 提升作用域
使用闭包的原因
1.函数会产生局部作用域
2.在外部另一个函数中使用局部变量,只能使用函数回调或闭包的方法
3.不能使用函数回调(函数已有固定参数,或不能拥有参数),只能将函数定义到拥有局部变量函数的内部,所以只能使用闭包
3.闭包的优点
1.外部函数不需要强制拥有参数以及返回值。
2.外部函数的局部变量也无需提升作用域,可以保证参数的安全性。
3.内部函数也不需要强制拥有参数以及返回值,便可以直接使用外部函数 的局部变量。
4.闭包可以解决的问题
①局部变量的持久化
function outer() {
// 请求得到的数据,如果不持久化,方法执行完毕,数据就被销毁
var data = [1,2,3,4,5];
console.log(data);
//通过闭包解决该类问题,所有代码均可以随意自定义
function inner() {
return data;
}
//数据被inner操作返回,inner数于outer
return inner;
}
var inner = outer();
console.log(inner());
②变量的污染
var lis = document.querySelectorAll('li');
//循环绑定
for (var i = 0; i < lis.length; i++) {
// 原理:一共产生了5个外层函数,存储的形参i的值分别为0,1,2,3,4
// 内层函数也产生了5个,且和外层函数一一对应,打印的i就是外层函数的形参i
(function (i) {
lis[i].onclick = function () {
alert(i);
}
})(i)
}
console.log(i);//点击事件一定晚于该逻辑
//所以再次去点击,弹出i的值,永远是5
// 该问题就称之为变量污染