代码之家  ›  专栏  ›  技术社区  ›  nowox

在JavaScript中限制条件赋值的范围

  •  2
  • nowox  · 技术社区  · 6 年前

    下面的代码将所有低于限制的点推入 data ,直到 getPoint null .

    while ((x = getPoint()) && x < limit) {
       data.push(x)
    }
    
    console.log(x, 'x should be undefined here')
    

    在这种特殊情况下,我使用条件赋值,我知道它看起来很难看,但是问题集中在 x let 好吧,但没用。

    是否可以限制 在里面 while 陈述?

    另一个有效的实现是这个,但在这种情况下,我将测试加倍 :

    do {
      let x = getPoint() 
      if (x && x < limit) {
        data.push(x)
      } 
    } while(x && x < limit) 
    

    while (true) {
      let x = getPoint()
      if (!x || x >= limit) {
        break;
      }
      data.push(x)
    }
    

    function* getPointIterator(limit) {
      let x = getPoint()
      while(x && x < limit) {
        yield x;
      }
    }
    
    data.push(...getPointIterator(limit))
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   gaetanoM    6 年前

    您可以考虑使用for循环更改while循环:

    var limit = 3;
    var r = 2;
    var data = [];
    
    function getPoint() {
        return r++;
    }
    
    
    for (let x=0; (x = getPoint()) && x < limit;) {
        data.push(x)
    }
    
    console.log(typeof(x) === 'undefined' ? 'undefined' : x, 'x should be undefined here')
        2
  •  1
  •   Dennis Vash    6 年前

    一。代码块 {...}

    光秃秃的 {…} 将变量分离为 局部范围

    {
      // do some job with local variables that should not be seen outside
    
      let message = "Hello";
    
      alert(message); // Hello
    }
    
    alert(message); // Error: message is not defined
    

    const limit = 3;
    let y = 0;
    const getPoint = () => y++;
    
    {
        let x = 0;
        while ((x = getPoint()) && x < limit) {
            console.log(x);
        }
    }
    console.log(x, 'x should be undefined here');
    

    块外部(或另一个脚本内部)的代码看不到块内部的变量,因为块具有 自己的词汇环境。

    (function {...})

    你可以用所谓的 立即调用的函数表达式 生活 )用于此目的。

    它们看起来像这样:

     (function() {
    
      let message = "Hello";
    
      alert(message); // Hello
    
    })();
    

    对于您的情况:

    const limit = 3;
    let y = 0;
    const getPoint = () => y++;
    
    (function () {
        let x = 0;
        while ((x = getPoint()) && x < limit) {
            console.log(x);
        }
    })();
    console.log(x, 'x should be undefined here');
    

    这里是 函数表达式 创建并立即调用。所以代码立即执行,并且有自己的私有变量。

    这个 函数表达式 用括号包装 ,因为当JavaScript遇到 “功能” 函数声明