闭包

作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。闭包所保存的整个变量对象,而不是某个特殊的变量,下面例子可以清晰的说明这个问题

    function createFun() {
    let result = new Array();
    for(var i = 0; i < 10; i++){
        result[i] = function(){
            return i;
        };
    }
    return result;
    }
    let funs = createFun();
    console.log(funs[0]);    //输出10
    console.log(funs[1]);    //输出10

每个函数都返回10 因为每个函数的作用域中保存这个createFun()函数的活动对象 所以它们引用的都是同一个变量i。当createFun()函数返回后 变量i的值是10,此时每个函数的引用着保存变量i的同一个变量对象,所以每个函数内部的值都是10。但是在ES6提供了let命令,就解决了这个问题,只需将var变量改成let 就不存在这个问题了

    function createFun() {
    let result = new Array();
    for(let i = 0; i < 10; i++){
        result[i] = function(){
            return i;
        };
    }
    return result;
    }
    let funs = createFun();
    console.log(funs[0]);    //输出0
    console.log(funs[1]);    //输出1
最后修改:2020 年 07 月 06 日 12 : 30 AM
如果觉得我的文章对你有用,请随意赞赏