var a = true, b = true, str = "";
if(a && b) {
  str += "a";
} else {
  str += "b";
}
alert(str+"c");
alert的时候有2种可能"ac","bc"
想要优化成
if(a) {
  if(b) {
    // 这里只是举例,实际用时,可能是一大堆的函数过程
    str += "a";  // 函数过程A
  } else {
    str += "b";  // 函数过程B
  }
} else {
  str += "b";    // 函数过程B
}
alert(str+"c");
类似这样的,也就是,假设b是一个比较复杂的函数,为了提高执行速度,只有当a为真的时候才执行b函数进行判断
上面的语句已经实现了这个功能,但“函数过程B”必须写2次
该如何优化才能做到
b只有a为真时才进行判断
且“函数过程B”只需要写一次(可别跟我说把“函数过程B”写到一个函数里,写2次调用函数)

解决方案 »

  1.   

    if(fun1() && fun2()) {
    当fun1返回true的时候 fun2就不会执行了 
    这不是常识么?
      

  2.   


    var a = true, b = true, str = "";
    if(a && b) {
      str += "a";
    } else {
      str += "b";
    }
    alert(str+"c");由于逻辑运算符的特性 已经是最优了
      

  3.   

    同意.如果a为false的话直接就到else了.不会判断B的
    --------------------------------------帅签分割线-------------------------------------------------
      

  4.   

    update....
    举例举错了.......
    var a = true, str = "", b = "a",  c = function(d) {
      alert("cfn");
      return typeof d;
    };if(a && (c(b) === "string" || c(b) === "number")) {
      str += "a";
    } else {
      str += "b";
    }
    alert(str+"c");
    上面这样的话,c函数就有可能被调用多次
    var a = true, str = "", b = "a",  c = function(d) {
      alert("cfn");
      return typeof d;
    };var d = c(b);
    if(a && (d === "string" || d === "number")) {
      str += "a";
    } else {
      str += "b";
    }
    alert(str+"c");
    这样的话,则c函数一定会被调用一次,即使a为false也是
    var a = true, str = "", b = "a",  c = function(d) {
      alert("cfn");
      return typeof d;
    };if(a) {
      var d = c(b);
      if(d === "string" || d === "number") {
        str += "a";  // 函数过程A
      } else {
        str += "b";  // 函数过程B
      }
    } else {
      str += "b";    // 函数过程B
    }
    alert(str+"c");
    这样虽然函数c只有当a为真时才会被调用一次,但“函数过程B”却必须写2次,当然可以把“函数过程B”“封装”成函数,但如果这样的话,我也就没必要发帖了...
    想要的优化结果就是
    函数c只有在a为真的情况下才被调用
    “函数过程B”在不“封装”成函数的情况下,只需要写一次
    好吧...上面错误的举例请直接无视吧...
      

  5.   

    刚要修改,结果系统提示已经有人回复的帖子无法编辑...看完主楼的人应该都会直接无视这帖了吧  TAT
      

  6.   

    if(a && b) {
    a如果不为真  b就不会走  没有必要优化
      

  7.   

    额...直接在c里面判断完不可以吗
    var a = true, str = "", b = "a",  c = function(d) {
      alert("cfn");
      return typeof d === 'string' || typeof d === "number";
    };if(a && c(b)) {
      str += "a";
    } else {
      str += "b";
    }
    alert(str+"c");
      

  8.   

    这倒也是一种方法
    但函数c是已经封装过的函数,不会为了一个函数过程而去修改其内容
    不过倒是可以再使用一个函数e来“封装”函数c...
    刚怎么就没想到呢...果然...BOSS来公司的话,就会头脑卡壳啊...魂淡!别有事没事就来我这说些无关紧要的事啊!!
      

  9.   

    ...LZ在自言自语么其实c这个函数没什么必要,就返回一个typeof d,可以直接用干嘛还要封装如果是特定的逻辑或功能方法就有必要封装下
    你的那个逻辑就是:如果为数字或字符串的话就返回true,这个逻辑有必要封装
      

  10.   

    A && B
    的运算顺序是情况1:如果A为假 B不会运行 直接判断表达式为假情况2:如果A为真 再判断B为真 此时B才运行 如果B为真则表达式判断为真,如果B为假则表达式判断为假var a = true, b = true, str = "";
    if(a && b) {
      str += "a";
    } else {
      str += "b";
    }
    alert(str+"c");
    这段已经符合要求了厄,LZ面壁吧