• leslee
    2019-12-26
    1. 他可以手动调用..., 在you dont know js 里面说过这个 .throw 可以委托异常.
    2. 这是由他的语义决定的, 如果他是一个语句, 那他就不能跟表达式连用, 如果他是一个表达式, 那他的返回值又显得有点多余.
    3.
    ```js
    function foo4(x = 5) {
          return {
            next: () => {
              return { done: !x, value: x && x-- };
            },
            "return": () => {
              return { done: true, value: '恭喜发财' }
            },
            "throw": () => {
              console.log("THROW!")
            }
          }
        }


        let x = new Object;
        x[Symbol.iterator] = foo4
    aaa: for (let item of x) {
          console.log(item, 'w')
          for (let item of x) {
            console.log(item, 'i')
            continue aaa;
          }
        }
    // echo 'return' x2
    // 当return 函数返回undefined 的时候会报这个错 Iterator result undefined is not an object
    ```
    被我试出来了, 当return函数返回undefined , 且嵌套循环且continue带有外层循环语句的标签的时候, 他会触发两次return, 缺一个条件都不行. 当return函数返回一个正常的迭代器对象`{done:true, value: 'xxx'}`, 他会输出5个return, 这个return应该由内层的forof 发出, 因为内层的循环直接被打断了, 继续下去的是外层循环, 单层循环不行是因为 continue 的语义并不是打断/结束, 是这样理解么老师, 这里面还有其他的豆子么,老师.
    4. 把x展开, 返回迭代值 , 如果 没有 * 返回的将是迭代器函数, .
    展开

    作者回复: 关于1和3,老实说,这个东西确实灰常灰常麻烦,你得自己去体会tor.return和tor.throw的含义与用法。

    我只能提示说:谁创建了tor,那么就该是谁去调用tor.return和tor.throw。这两个方法不是事件触发,而是“tor的持有者”调用。

    关于2,你的答案没有对或不对的问题,但我觉得还有深思的余地。不妨多思考一下,不着急有结论。另外,这个问题没有标准答案。

    关于4,你“可能”是对的,但似乎表达得不太清楚。^^.

    
     2
  • antimony
    2020-02-09
    老师,请问一下这个迭代和递归的关系您是从sicp中了解到的吗?
    
    
  • Smallfly
    2020-01-16

    // 迭代函数
    function foo(x = 5) {
      return {
        next: () => {
          return {done: !x, value: x && x--};
        }
      }
    }

    const tor = foo();
    const names = Object.getOwnPropertyNames(tor.constructor.prototype);

    console.log(names);
    /*
      [ 'constructor',
      '__defineGetter__',
      '__defineSetter__',
      'hasOwnProperty',
      '__lookupGetter__',
      '__lookupSetter__',
      'isPrototypeOf',
      'propertyIsEnumerable',
      'toString',
      'valueOf',
      '__proto__',
      'toLocaleString' ]
    */

    请问老师我用 node 执行上面的代码,为什么跟文中的以下输出不一致呢。

    > Object.getOwnPropertyNames(tor.constructor.prototype)
    [ 'constructor', 'next', 'return', 'throw' ]
    展开

    作者回复: 这里的foo()是一个模拟生成器函数的界面的,所以它当然得不到“真的”生成器。

    你需要的示例是这样:
    ```
    function* foo() {}
    tor = foo();
    names = Object.getOwnPropertyNames(tor.constructor.prototype);
    ```

     1
    
  • sprinty
    2019-12-02
    四个思考题,都没能找到很好的答案。。。
     1
    
我们在线,来聊聊吧