依据CocosCreator游戏开发浅谈JS中的var与let

……相信很多用过js的同学们,都知道js里边有两种定义变量的方式,一个是var,一个是let:
var a=0;letb=0;
……那么,此时很多人就会问,var和let有什么区别呢?
……在没有深究之前,我与很多的同学们都以为var跟let基本是一样的,没啥区别,然后我本人觉得var比较好看,相对堆成,就强迫自己把let的变量习惯改成了var,然而今天居然有人跟我说:用var会比let更加节省性能。我心想:我擦,还有这样的事情,你可别吓我。
……于是我开始探究var跟let的区别,经过一番搜索,其实你们也能搜到,是的,var和let是有区别的,它们定义的变量的一个定义域不一样,这在很多博客中也能搜索到。然而,它们有什么区别呢?
……在CocosCreator前,我深深吸了一口老烟,虽说我不抽烟哈。浅谈一下区别吧,很多人说,var定义的是全局变量以及局部变量,var定义的一个变量都会在更高的一个域内,暂且这般理解吗,但其实感觉也不太对。let定义的呢?let定义的是块状变量,局部变量,大概相当于都是临时那种的变量吧。(但其实似乎var跟let定义的都是临时变量,其中有一丢丢的区别,但let更娇小一点吧,很临时。)
……这般说理论也说不清楚,还是来几行代码吧,你们瞧瞧:

 start(){
        for(let i=0;i<3;i++){
            setTimeout(()=>{console.log(i),0})
        }
        //结果为0、1、2
        for(var j=0;j<3;j++){
           setTimeout(()=>{console.log(j),0})
        }
        //结果为3、3、3
 }

……在这里吧,如果循环中都是直接打印的话,结果肯定都是012吧,但做了延时处理,即便是0秒的延迟,但执行顺序也是不一样啦,结果不一样啦。也就是说,那个打印的值需要这边保留着,然后传递出去,让那边打印对吧。let定义的话,打印了三个值,也就是说,定义了传递的四个值,0123对吧,但由于有条件限制,打印的只有012,这就是每一个定义的传递的都是一个小块的值吧,而不是引用。而var定义的话,则都是一个值,但循环执行完了,j的值不断发生改变,最终加到了3,同样j的值也是应该传递了4次,但我是这么理解吧,这个var定义的j传过去是个引用的类型,并不是一个值,当j被改变了,传过去的引用最终的值也会被改变,然后后面改变了j,打印出来的都是4。
……如果按照var定义跟let定义的一个变量是一样的话,然后只是执行域不一样理解的话,var定义的值是在更高一层的域,而let定义的是在域内。那么var定义的这个值应该是在for循环之外的,所以传过去打印的还是for循环之外的一个值,且改变的了,归根到底还是一个值,一个引用。而let定义的话是在域内,也就是在for循环之外的,传过去的值又被定义成了一个参数,有自己对应值的,所以才会打印出3不同的值。
……以上大概是var和let的一个定义上的区别吧,好吧,其实我说的也不明不白,但同学们只要知道var定义和let定义的东西是有区别的就好。特别在多人合作和协作的游戏制作中,一般来说都是会用let好一点,因为var定义的很容易混淆变量(大佬是这么说的哈,还是写var会被打,哈哈,但我目前接手的js老项目基本都是用了var,但不知道那时候let有没有出来)。
……然鹅,还有人说,var和let有性能上的区别,说let比var的性能好,我擦,我不信,结果网上一搜,还真有,且看代码。

start(){
        console.time("var");
        for(var j=0;j<100000;j++){
            //this.setOut(j);
            var jvar=j;
            //setTimeout(()=>{this.setOut(j),0})
         }
         console.timeEnd("var");

        console.time("let");
        for(let i=0;i<100000;i++){
            //this.setOut(i);
            let ilet=i;
            //setTimeout(()=>{this.setOut(i),0})
        }
        console.timeEnd("let");
}

……有人在博客摆出这样的例子,说打印出来的一个时间参数,let用的时间比var的短,似乎是的,我这样一尝试,还真是诶?打印时间分别为:var: 1.370999999999981ms、let: 1.1560000000000628ms。这样一看,似乎let用时短喔,我去,let的性能好,真的吗?我不信,我把这几行代码换了个顺序:

start(){
       console.time("let");
        for(let i=0;i<100000;i++){
            //this.setOut(i);
            let ilet=i;
            //setTimeout(()=>{this.setOut(i),0})
        }
        console.timeEnd("let");


        console.time("var");
        for(var j=0;j<100000;j++){
            //this.setOut(j);
            var jvar=j;
            //setTimeout(()=>{this.setOut(j),0})
         }
         console.timeEnd("var");
}

……没错,我把它们的顺序倒了过来,咱们搞研究,要科学一点,来,测试试一下结果,结果打印的时间分别为:let: 1.336999999999989ms、var: 1.2110000000000127ms。我擦,这是岂不是说var比let的性能好了吗?
……谁先谁快?也不尽然,测试完这两个结果的时候,我很激动,喊我的小伙伴也来看看,结果他来的时候,我去,变成谁在前面谁在快了,似乎var和let很魔性,但我不信邪,我换了个法子来测试。我把两个循环都放前边,然后再来测试打印的循环。这时候的代码成了这样子:

start(){
        for(let k=0;k<100;k++){
            let klet=k;
        }

        for(var t=0;t<100;t++){;
            var tlet=t;
        }


        console.time("let");
        for(let i=0;i<100000;i++){
            //this.setOut(i);
            let ilet=i;
            //setTimeout(()=>{this.setOut(i),0})
        }
        console.timeEnd("let");


        console.time("var");
        for(var j=0;j<100000;j++){
            //this.setOut(j);
            var jvar=j;
            //setTimeout(()=>{this.setOut(j),0})
         }
         console.timeEnd("var");
}

……我们先来看看结果:(let: 1.3239999999999554ms/var: 1.3780000000000427ms)、(let: 1.3670000000000755ms/var: 1.3519999999999754ms)、(let: 1.3729999999999336ms/var: 1.4789999999999281ms)。似乎这很玄幻,咱们再换个位置:

start(){
        for(let k=0;k<100;k++){
            let klet=k;
        }

        for(var t=0;t<100;t++){;
            var tlet=t;
        }

        console.time("var");
        for(var j=0;j<100000;j++){
            //this.setOut(j);
            var jvar=j;
            //setTimeout(()=>{this.setOut(j),0})
         }
        console.timeEnd("var");
        
        console.time("let");
        for(let i=0;i<100000;i++){
            //this.setOut(i);
            let ilet=i;
            //setTimeout(()=>{this.setOut(i),0})
        }
        console.timeEnd("let");
}

……我们再来看看结果:(var: 1.3120000000000118ms/let: 1.3309999999999036ms)、(var: 1.3110000000000355ms/let: 1.1319999999999482ms)、(var: 1.2889999999999873ms/let: 1.34699999999998ms)。
……事实证明:var和let定义,似乎没有太大的性能上的区别,估摸着消耗的性能差不多是一样的,虽然科学上理论上来说不能说差不多,但似乎真的差不多,也就是说var和let从定义变量这个层面上来说的效率几乎是一样的。但因为var定义的一个域的问题,我个人建议临时变量的话还是用let来比较好一点,不然,真的很容易造成一些混淆,在游戏开发的一些流程中,可能会出现一些让开发者蒙圈的问题,哈哈,感谢你的阅读。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值