什么事闭包?个人理解 函数作为返回值或参数传递即为闭包
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中的执行上下文,所有的变量的定义及函数声明都会被提前放到前面。
如何理解作用域链?
自由变量
作用域链、即自由变量的查找
闭包的两个场景(上面两个例子)