对js函数作用域的进一步理解

        今天在写一个threejs的项目时,遇到了一个问题,我需要批量初始化一批图片作为纹理图放入数组中,然后再批量初始化一堆JSON模型,最后在把纹理图贴到对应的模型上面,这里就涉及到了几个问题。

        1.首先加载图片和模型都是一个异步的操作,换句话说,你不能控制那张图片或者哪个模型先加载好,我想到的解决方法是,用一个计数的变量在每次调用加载器时,确定某张图片或者某个模型存放的位置,这样就能够做到模型与图片一一对应。

        2.在加载模型时我又遇到了作用域的问题,开始我是这么写的,很明显load方法的onComplete参数根本无法接收到i这个变量,因为异步的原因,等到该函数执行的时候必然是找不到i变量的(因为i已经释放掉了),所以我们必须找到一个办法使得能够找到i。

for (var i = 0 ; i < len; i++) {
        loader.load("zp/dwjs/" + objArray2[i] + ".js", function (geometry, materials) {
            var object = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial(materials));
            object.scale.set(scale, scale, scale);
            object.position.set(0, 0, 0);
            object.rotation.set(0, 0, 0);
            object.receiveShadow = true;
            scene.add(object);
            object.material.materials[0].map = tex_arr[i];
            uppross(1);
        });
}
        3.我有将i设置成了全局变量,但是问题又来了,当onComplete调用i时,i已经自加到了len,所以这个办法也不行。

        4.最后我使用了一个匿名函数,然他收一个i参数,这样每次加载之前,匿名函数中就会为onComplete存放当前i的值,当加载完成之后就可以直接使用该Mesh对应的i,等这一切执行完毕,系统才会释放这个匿名函数以及其中的i变量,这样就巧妙地完成了我们的目的。

for (var i = 0 ; i < len; i++) {
    (function(i) {
        loader.load("zp/dwjs/" + objArray2[i] + ".js", function (geometry, materials) {
            var object = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial(materials));
            object.scale.set(scale, scale, scale);
            object.position.set(0, 0, 0);
            object.rotation.set(0, 0, 0);
            object.receiveShadow = true;
            scene.add(object);
            object.material.materials[0].map = tex_arr[i];
            console.log("!",object);
            uppross(1);
        });
    })(i);
}
        之前我也研究过关于js作用域,闭包之类的文章,并自己总结发表了博客,当时只是对照书中的案例写了一遍,不甚清楚,如今等自己真正踩了一遍这个作用域的小坑,也算对其又增强了几分了解~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值