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