DAY56-前端入门-javascript(三)

一、函数回调

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
// 该问题就称之为变量污染
posted @ 2018-10-16 19:39  藏岚  阅读(102)  评论(0编辑  收藏  举报