javascript - js中作用域,闭包问题
天蓬老师
天蓬老师 2017-04-11 10:56:53
[JavaScript讨论组]
var data =[];
    for(var i=0;i<3;i++){
        data[i] = function(i){
            console.log(i);
        }
    }
    
    data[0]();
    data[1]();
    data[2]();

1、请问一下为何执行data[0]时是undefined?
2、for循环执行后,会分配3个空间,放着3个function吗?如果是,i的值会传进去吗?
3、执行结果是undefined,是因为执行完for循环完,没有3个空间,都释放了吗?还是其他原因
4、如果像传进去i,要用闭包(我已经试过了),是闭包会分配空间一直不释放吗?有其他方法吗?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(4)
黄舟

第一次答题,如果有错误的地方,希望能指正。如果觉得有帮助,希望能点赞鼓励下^0^

  1. 因为data[0],data[1],data[2]都只是保存了函数

    function(i){  console.log(i); }

    调用时没有给形参传值,所以data[0],data[1],data[2]都是undefined;

    注意:函数的i是形参,不是for()里的变量i;你可以调用 data[0](1)(这里传入了参数1,结果是1)来验证我的说法。

  2. for循环结束后,data里的每个元素都变成了function(i){ console.log(i); }。可以通过console.log(data[0])、console.log(data[1])、console.log(data[2])来验证。

  3. 不是。理解了我说的第1和第2条回答,你就懂了。

  4. 如果你用闭包,是能正确打印出0,1,2的。如改成

    var data =[];
        for(var i=0;i<3;i++){
            data[i] = (function(i){
                return function(){
                    console.log(i);
                }
            })(i);    //自调用,传入了变量i
        }
        data[0]();// 打印出0
        data[1]();// 1
        data[2]();//2
高洛峰

有这个误区是作用域还没搞明白。
来分析一下作用域把。

var data =[];
for(var i=0;i<3;i++){
    // window作用域 含有 data,i
    data[i] = function(i){
        // 匿名函数作用域 包含一个参数变量 i。此时的作用域链关系是 全局(data,i)→当前(i);
        console.log(i); //所以这个i引用的是匿名函数的i 
    }
}
data[0](); // 没有传递参数 所以函数用undefined补全了 实质 function(undefined){console.log(i)}
data[1]();
data[2]();

你分配了三个空间,这个三个匿名函数是独立的

迷茫
  1. 因为 i 的值没有传入 函数调用时候,(),空参数的

  2. 一个是函数的参数叫 i, 一个是有一个变量叫 i,不一样的东西

  3. 同第一个...

  4. 没听懂...

怪我咯

你可以console.log(data);看一下,data里边会有3个匿名函数,在你循环定义的时候创建3个匿名函数,同时函数的参数为i,执行的时候console.log(i),最后你调用的时候并没有传参数(i)所以是undefined! 最后你可以试一下data[0](0);data[1](1);data[2](2);

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号