找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1609|回复: 14

[求助] 如何修改才能避免重复判断?

[复制链接]
发表于 2016-4-12 11:42:44 | 显示全部楼层 |阅读模式
自定义了一个类,发现判断是个重复的问题,目前想做到判断一次,请问高手该如何修改才能避免每次循环就判断?代码如下:

function AutoPlay(start, obj, total, classname, interval, objBar) {
                        var n = start;
                        var loop = null;
                        this.play = function play() {
                                for (i = 0; i < total; i++) {
                                        objBar ? obj[i].className = objBar[i].className = "": obj[i].className = "";
                                }
                                objBar ? obj[n].className = objBar[n].className = classname: obj[n].className = classname;
                                n++;
                                n = n == total ? 0 : n;
                                loop = setTimeout(function() {
                                        play();
                                },
                                interval);
                        }
                        this.stop = function() {
                                clearTimeout(loop);
                        }
                }
 楼主| 发表于 2016-4-12 12:10:41 | 显示全部楼层
看来“蓝色理想” 真的是现在没人了,想想以前那气氛,╮(╯▽╰)╭,希望论坛能复活。
回复 支持 反对

使用道具 举报

发表于 2016-4-12 14:34:18 | 显示全部楼层
本帖最后由 jianwang19 于 2016-4-12 14:53 编辑

空间换时间,应该算是普遍的处理方式吧
function AutoPlay(start, obj, total, classname, interval, objBar) {
                        var n = start;
                        var loop = null;
                        var bool = false, prev = 0;
                        this.play = function play() {
                                if(!bool){
                                for (i = 0; i < total; i++) {
                                        objBar ? obj[i].className = objBar[i].className = "": obj[i].className = "";
                                }
                                bool = true;
                                                        }else{
                                                                objBar ? obj[prev].className = objBar[prev].className = "": obj[prev].className = "";
                                                        }
                            objBar ? obj[n].className = objBar[n].className = classname: obj[n].className = classname;
                            prev = n;
                            n++;
                            n = n == total ? 0 : n;
                            loop = setTimeout(function() {
                                    play();
                            },
                            interval);
                        }
                        this.stop = function() {
                                clearTimeout(loop);
                        }
                }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-12 15:49:44 | 显示全部楼层
jianwang19 发表于 2016-4-12 14:34
空间换时间,应该算是普遍的处理方式吧
function AutoPlay(start, obj, total, classname, interval, objB ...

还没看,先谢谢你了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-12 15:55:31 | 显示全部楼层
jianwang19 发表于 2016-4-12 14:34
空间换时间,应该算是普遍的处理方式吧
function AutoPlay(start, obj, total, classname, interval, objB ...

没看懂你发的,你写的其实和我的一样啊,for循环内一直都有objBar ? obj[i].className = objBar[i].className = "": obj[i].className = "";
这个判断语句。我是想达到先判断,然后循环。至今还没想到解决办法。是不是你理解错了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-12 15:58:38 | 显示全部楼层
本帖最后由 chenglidian 于 2016-4-12 16:10 编辑
chenglidian 发表于 2016-4-12 15:55
没看懂你发的,你写的其实和我的一样啊,for循环内一直都有objBar ? obj.className = objBar.className = ...


function AutoPlay(start, obj, total, classname, interval, objBar) {
                        var n = start;
                        var loop = null;
                        this.play = function play() {
                                for (i = 0; i < total; i++) {
                                        objBar ? obj[i].className = objBar[i].className = "": obj[i].className = "";
                                }
                                objBar ? obj[n].className = objBar[n].className = classname: obj[n].className = classname;
                                n++;
                                n = n == total ? 0 : n;
                                loop = setTimeout(function() {
                                        play();
                                },
                                interval);
                        }
                        this.stop = function() {
                                clearTimeout(loop);
                        }
                }
上面的代码在for 循环中重复了 是否存在objBar的判断,问题就是因为再循环中,所以想改进,
大概思路是:如果存在参数objBar 就循环obj[i].className = objBar[i].className = "";
否则就循环obj[i].className = "";
思路就是上面描述的情况,不想让在or循环中进行判断
回复 支持 反对

使用道具 举报

发表于 2016-4-12 19:25:37 | 显示全部楼层
for循环是用来重置classname的吧,现在用bool来保存状态,用prev记录上一次操作的元素,只需要循环一次,第二次以后只需要对特定的元素进行修改,不用每次都循环。
当然,如果元素不多,影响不大。
但是如果元素不多,for循环做一次判断也没什么。
如果只是为了去掉判断,这样吧
  1. function A(n){
  2.         if(n){
  3.                 this.write = function(){
  4.                         console.log(n);
  5.                 }
  6.         }else{
  7.                 this.write = function(){
  8.                         console.log(0);
  9.                 }
  10.         }
  11. }
  12. var a = new A();
  13. var aa = new A('你好');
  14. a.write();
  15. aa.write();
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-14 10:50:36 | 显示全部楼层
jianwang19 发表于 2016-4-12 19:25
for循环是用来重置classname的吧,现在用bool来保存状态,用prev记录上一次操作的元素,只需要循环一次,第 ...

好的,谢谢你了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-14 11:13:54 | 显示全部楼层
jianwang19 发表于 2016-4-12 19:25
for循环是用来重置classname的吧,现在用bool来保存状态,用prev记录上一次操作的元素,只需要循环一次,第 ...

还想再问你一个关于传参的问题,比如一个函数 fn(a,b,c) 如果内部的传参都是非必需的,怎么自行判断出没有某一个参数做出不同的运行结果?
就好像,如果缺少形参b就弹出“缺少参数b”,缺少形参b就弹出"缺少参数b";
如下:
function myfn(a,b,c){
//代码内容
}
myfn(b,c) //让弹出缺少参数a
myfn(a,c) //让弹出缺少参数b
myfn(a,b) //让弹出缺少参数C

是不是这样很奇葩? 不过确实遇到过类似问题。
回复 支持 反对

使用道具 举报

发表于 2016-4-14 13:53:24 | 显示全部楼层
if(!a){b... c...}
试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-14 14:08:55 | 显示全部楼层
abaddonpoet 发表于 2016-4-14 13:53
if(!a){b... c...}
试试

不行的,因为你根本不知道传进来的实参是对应的哪儿个形参。问题就是这里。
比如 function myfn(a,b,c) 然后myfn("实参","实参1")默认如果少于形参的话就是默认先后对号入座的(分别对应a和b),如果我想实参对应的的事形参a 和c 该怎么办?实参中只有两个参数
回复 支持 反对

使用道具 举报

发表于 2016-4-14 14:35:10 | 显示全部楼层
给1个空参站位可以吗
myfn('','','')
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-14 16:05:43 | 显示全部楼层
abaddonpoet 发表于 2016-4-14 14:35
给1个空参站位可以吗
myfn('','','')

空的参数不行的,要是空的参位有了,就不用判断了。
我们经常遇到一些别人写好的函数,比如传参数就调用一个方法,不传这个参数就会调用另外一个方法,不知道别人这种方法是如何实现的
回复 支持 反对

使用道具 举报

发表于 2016-4-15 21:20:19 | 显示全部楼层
在其他语言里面可以通过参数类型来判断,JavaScript有时候也可以用这个方法,有时候还可以用约定的参数范围来判断。
比如有一个方法function fun(a,b){} 如果没有传任何参数直接调用fun(),这个时候,a、b都是undefined,如果传了一个,很显然就是a,但是如果我想把b传进来,不传a,那么就要做一个判断,当a>10,那么这个就是b,或者如果a是布尔型,那么也是b,又或者是字符型,等等。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-18 10:44:24 | 显示全部楼层
jianwang19 发表于 2016-4-15 21:20
在其他语言里面可以通过参数类型来判断,JavaScript有时候也可以用这个方法,有时候还可以用约定的参数范围 ...

是啊,如果一个方法的参数具备不同的数据类型或者相同类型的不同取值范围,那么就好判断参数是属于哪儿个了。问题是这个参数是同一种类型,并且还是不固定的,一旦是这个情况,真的不知道该怎么判断,加入用一个布尔值进行约定哪儿个参数是否存在,那么就好像很繁琐和麻烦一样。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )

GMT+8, 2021-1-20 06:16 , Processed in 0.064349 second(s), 7 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表