JS作用域的理解
简单来说,闭包是指有权访问其他函数作用域中的变量的函数,是定义在函数内部的函数。
当某个函数被调用时,会创建一个执行环境和相应的作用域链,自由变量不断向父级作用域中查找其变量的定义。
自由变量指当前作用域中没有定义的变量。
父级作用域是指函数定义时的上一级作用域,而不是函数执行的上一级作用域。
闭包的使用场景基本分为两种:
1、函数作为返回值
function F1 () { var a = 100; //父级作用域 return function () { console.log (a) } } var f1 = F1 (); var a = 200; //全局作用域 f1 (); //100
2、函数作为参数传递
function F1 () { var a = 100; //父级作用域 return function () { console.log (a) //自由变量 } } function F2 (fn) { var a = 200; fn (); } var f1 = F1 (); F2 (f1); //100
实际开发中闭包的应用:常用于封装变量,以下方法用来判断用户是否是第一次加载
function isFirstLoad () { var _list = []; return function (id) { if ( _list.indexOf (id) >= 0 ) { return false; } else { _list.push (id); return true; } } } var firstLoad = isFirstLoad (); firstLoad (10); //true firstLoad (10); //false firstLoad (20); //true firstLoad (20); //false