javascript闭包的理解

什么事闭包?个人理解 函数作为返回值或参数传递即为闭包

this: 在js中,this在定义时是无法确认的,只有在执行时才能确定值。

在js中是没有块级作用域的,js和C#、Java等语言不通,是一门解释性语言,这点需要特别注意。需要避免变量污染需要将变量定义在函数作用域中。

  • 作为返回值的情况如下:
function F1() {
	var a = 100;
	return function () {
		console.log(a)
	}
}
var a = 10;
var f1 = F1();
f1()
// 执行结果 100
  • 作为参数传递:
function F1() {
	var a = 100;
	return function () {
		console.log(a)
	}
}
function f2(fn) {
	var a = 100;
	fn()
}
var f1 = F1();
f2(f1)

// 结果 100

闭包的作用是什么呢?个人理解:封装变量,收敛权限

实际开发中的例子:

function isFirstLoad () {
	var _list = [];
	return function (id) {
		if (_list.indexOf(id)) {
			return false;
		} else {
			_list.push(id);
			return true;
		}
	}
}
var fisrtLoad = isFirstLoad();
fisrtLoad(10); // true
fisrtLoad(10); // false
fisrtLoad(20); // true

上面例子,在匿名函数中,a是自由变量,因此在作用域链中会找到父级作用域中去找,也就是100。父级作用域是在定义的时候决定的,而不是在执行时决定。

  • 变量提升
    在js中的执行上下文,所有的变量的定义及函数声明都会被提前放到前面。

如何理解作用域链?

自由变量
作用域链、即自由变量的查找
闭包的两个场景(上面两个例子)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值