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

 

posted @ 2017-12-07 20:37  Tracy_yo  阅读(425)  评论(0编辑  收藏  举报