为了账号安全,请及时绑定邮箱和手机立即绑定

初学闭包,不太明白,求大神指教

初学闭包,不太明白,求大神指教

慕雪6442864 2018-11-21 17:19:55
function box() {    var arr = [];    for (var i = 0; i < 5; i++) {        arr[i] = function () {            return i;        }    }    return arr;}var b = box();for (var i = 0; i < 5; i++) {    alert(b[i]);}     当box()执行完之后,为什么arr[0]到arr[4]里面的值都是function () { return i;}为什么不依次是:function () {return 0;},function () {return 1;}。。。
查看完整描述

1 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

因为闭包只能取得包含函数中任何变量的最后一个值,在这里指的就是i这个变量,box()函数执行后返回的是一个函数数组,数组中的每一个i引用的都是同一个变量i,注意box()返回的是一个函数!所以里面的{return i}这只是函数内的一个声明,还没有执行呀,所以当然保持{return i}不变。因为引用的是同一个外部i,所以当box()函数返回后,外部变量i的值是5,此时每一个return中都引用着保存变量i的同一个变量对象,所以如果最后执行了内部的arr[]中的函数,最后每个函数内部的i的值都是5.

//执行内部返回的arr中的函数,当然box()[1]()、box()[2]()、box()[3]()...都返回5;

    function box() {

        var arr = [];

        for (var i = 0; i < 5; i++) {

             arr[i] = function () {

                return i;

            }

        }

        return arr;

    } 

    box()[1](); //执行后返回5


//不执行内部函数,仅仅是box()的话,当然只返回一个function咯

    function box() {

        var arr = [];

        for (var i = 0; i < 5; i++) {

             arr[i] = function () {

                return i;

            }

        }

        return arr;

    } 

    box(); //[function, function, function, function, function]


查看完整回答
反对 回复 2018-12-22
  • 1 回答
  • 0 关注
  • 559 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信