{"id":1361,"date":"2024-06-02T22:22:26","date_gmt":"2024-06-02T22:22:26","guid":{"rendered":""},"modified":"2024-06-05T03:09:46","modified_gmt":"2024-06-04T19:09:46","slug":"es6-%e7%b3%bb%e5%88%97%e4%b9%8b-babel-%e5%b0%86-generator-%e7%bc%96%e8%af%91%e6%88%90%e4%ba%86%e4%bb%80%e4%b9%88%e6%a0%b7%e5%ad%90","status":"publish","type":"post","link":"https:\/\/www.lccc.top\/?p=1361","title":{"rendered":"ES6 \u7cfb\u5217\u4e4b Babel \u5c06 Generator \u7f16\u8bd1\u6210\u4e86\u4ec0\u4e48\u6837\u5b50"},"content":{"rendered":"<td class=\"d-block comment-body markdown-body  js-comment-body\">\n<h2 dir=\"auto\">\u524d\u8a00<\/h2>\n<p dir=\"auto\">\u672c\u6587\u5c31\u662f\u7b80\u5355\u4ecb\u7ecd\u4e0b Generator \u8bed\u6cd5\u7f16\u8bd1\u540e\u7684\u4ee3\u7801\u3002<\/p>\n<h2 dir=\"auto\">Generator<\/h2>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function* helloWorldGenerator() {\n  yield 'hello';\n  yield 'world';\n  return 'ending';\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span><span class=\"pl-c1\">*<\/span> <span class=\"pl-s1\">helloWorldGenerator<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">yield<\/span> <span class=\"pl-s\">'hello'<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-k\">yield<\/span> <span class=\"pl-s\">'world'<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s\">'ending'<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6211\u4eec\u6253\u5370\u4e0b\u6267\u884c\u7684\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='var hw = helloWorldGenerator();\n\nconsole.log(hw.next()); \/\/ {value: \"hello\", done: false}\nconsole.log(hw.next()); \/\/ {value: \"world\", done: false}\nconsole.log(hw.next()); \/\/ {value: \"ending\", done: true}\nconsole.log(hw.next()); \/\/ {value: undefined, done: true}'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">hw<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">helloWorldGenerator<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">hw<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">next<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ {value: \"hello\", done: false}<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">hw<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">next<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ {value: \"world\", done: false}<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">hw<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">next<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ {value: \"ending\", done: true}<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">hw<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">next<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ {value: undefined, done: true}<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">Babel<\/h2>\n<p dir=\"auto\">\u5177\u4f53\u7684\u6267\u884c\u8fc7\u7a0b\u5c31\u4e0d\u8bf4\u4e86\uff0c\u6211\u4eec\u76f4\u63a5\u5728 Babel \u5b98\u7f51\u7684 <a href=\"https:\/\/babeljs.io\/repl\" rel=\"nofollow\">Try it out<\/a> \u7c98\u8d34\u4e0a\u8ff0\u4ee3\u7801\uff0c\u7136\u540e\u67e5\u770b\u4ee3\u7801\u88ab\u7f16\u8bd1\u6210\u4e86\u4ec0\u4e48\u6837\u5b50\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='\/**\n * \u6211\u4eec\u5c31\u79f0\u547c\u8fd9\u4e2a\u7248\u672c\u4e3a\u7b80\u5355\u7f16\u8bd1\u7248\u672c\u5427\n *\/\nvar _marked = \/*#__PURE__*\/ regeneratorRuntime.mark(helloWorldGenerator);\n\nfunction helloWorldGenerator() {\n  return regeneratorRuntime.wrap(\n    function helloWorldGenerator$(_context) {\n      while (1) {\n        switch ((_context.prev = _context.next)) {\n          case 0:\n            _context.next = 2;\n            return \"hello\";\n\n          case 2:\n            _context.next = 4;\n            return \"world\";\n\n          case 4:\n            return _context.abrupt(\"return\", \"ending\");\n\n          case 5:\n          case \"end\":\n            return _context.stop();\n        }\n      }\n    },\n    _marked,\n    this\n  );\n}'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/**<\/span>\n<span class=\"pl-c\"> * \u6211\u4eec\u5c31\u79f0\u547c\u8fd9\u4e2a\u7248\u672c\u4e3a\u7b80\u5355\u7f16\u8bd1\u7248\u672c\u5427<\/span>\n<span class=\"pl-c\"> *\/<\/span>\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">_marked<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c\">\/*#__PURE__*\/<\/span> <span class=\"pl-s1\">regeneratorRuntime<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">mark<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">helloWorldGenerator<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">helloWorldGenerator<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">regeneratorRuntime<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">wrap<\/span><span class=\"pl-kos\">(<\/span>\n    <span class=\"pl-k\">function<\/span> <span class=\"pl-en\">helloWorldGenerator$<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-k\">while<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">switch<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prev<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">next<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n          <span class=\"pl-k\">case<\/span> <span class=\"pl-c1\">0<\/span>:\n            <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">next<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-k\">return<\/span> <span class=\"pl-s\">\"hello\"<\/span><span class=\"pl-kos\">;<\/span>\n\n          <span class=\"pl-k\">case<\/span> <span class=\"pl-c1\">2<\/span>:\n            <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">next<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">4<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-k\">return<\/span> <span class=\"pl-s\">\"world\"<\/span><span class=\"pl-kos\">;<\/span>\n\n          <span class=\"pl-k\">case<\/span> <span class=\"pl-c1\">4<\/span>:\n            <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">abrupt<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"return\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"ending\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n          <span class=\"pl-k\">case<\/span> <span class=\"pl-c1\">5<\/span>:\n          <span class=\"pl-k\">case<\/span> <span class=\"pl-s\">\"end\"<\/span>:\n            <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">stop<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n      <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-s1\">_marked<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-smi\">this<\/span>\n  <span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u731b\u4e00\u770b\uff0c\u597d\u50cf\u7f16\u8bd1\u540e\u7684\u4ee3\u7801\u8fd8\u86ee\u5c11\u7684\uff0c\u4f46\u662f\u7ec6\u7ec6\u4e00\u770b\uff0c\u7f16\u8bd1\u540e\u7684\u4ee3\u7801\u80af\u5b9a\u662f\u4e0d\u80fd\u7528\u7684\u5440\uff0c<code class=\"notranslate\">regeneratorRuntime<\/code> \u662f\u4e2a\u4ec0\u4e48\u9b3c\uff1f\u54ea\u91cc\u6709\u58f0\u660e\u5440\uff1f<code class=\"notranslate\">mark<\/code> \u548c <code class=\"notranslate\">wrap<\/code> \u65b9\u6cd5\u53c8\u90fd\u505a\u4e86\u4ec0\u4e48\uff1f<\/p>\n<p dir=\"auto\">\u96be\u9053\u5c31\u4e0d\u80fd\u7f16\u8bd1\u4e00\u4e2a\u5b8c\u6574\u53ef\u7528\u7684\u4ee3\u7801\u5417\uff1f<\/p>\n<h2 dir=\"auto\">regenerator<\/h2>\n<p dir=\"auto\">\u5982\u679c\u4f60\u60f3\u770b\u5230\u5b8c\u6574\u53ef\u7528\u7684\u4ee3\u7801\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528 <a href=\"https:\/\/github.com\/facebook\/regenerator\">regenerator<\/a>\uff0c\u8fd9\u662f facebook \u4e0b\u7684\u4e00\u4e2a\u5de5\u5177\uff0c\u7528\u4e8e\u7f16\u8bd1 ES6 \u7684 generator \u51fd\u6570\u3002<\/p>\n<p dir=\"auto\">\u6211\u4eec\u5148\u5b89\u88c5\u4e00\u4e0b regenerator\uff1a<\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npm install -g regenerator\">\n<pre class=\"notranslate\">npm install -g regenerator<\/pre>\n<\/div>\n<p dir=\"auto\">\u7136\u540e\u65b0\u5efa\u4e00\u4e2a generator.js \u6587\u4ef6\uff0c\u91cc\u9762\u7684\u4ee3\u7801\u5c31\u662f\u6587\u7ae0\u6700\u4e00\u5f00\u59cb\u7684\u4ee3\u7801\uff0c\u6211\u4eec\u6267\u884c\u547d\u4ee4\uff1a<\/p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"regenerator --include-runtime generator.js &gt; generator-es5.js\">\n<pre class=\"notranslate\">regenerator --include-runtime generator.js <span class=\"pl-k\">&gt;<\/span> generator-es5.js<\/pre>\n<\/div>\n<p dir=\"auto\">\u6211\u4eec\u5c31\u53ef\u4ee5\u5728 generator-es5.js \u6587\u4ef6\u770b\u5230\u7f16\u8bd1\u540e\u7684\u5b8c\u6574\u53ef\u7528\u7684\u4ee3\u7801\u3002<\/p>\n<p dir=\"auto\">\u800c\u8fd9\u4e00\u7f16\u8bd1\u5c31\u7f16\u8bd1\u4e86 700 \u591a\u884c\u2026\u2026 \u7f16\u8bd1\u540e\u7684\u4ee3\u7801\u53ef\u4ee5\u67e5\u770b <a href=\"https:\/\/github.com\/mqyqingfeng\/Blog\/blob\/master\/demos\/ES6\/generator\/generator-es5.js\">generator-es5.js<\/a><\/p>\n<p dir=\"auto\">\u603b\u4e4b\u7f16\u8bd1\u540e\u7684\u4ee3\u7801\u8fd8\u86ee\u590d\u6742\uff0c\u6211\u4eec\u53ef\u4ee5\u4ece\u4e2d\u62bd\u79bb\u51fa\u5927\u81f4\u7684\u903b\u8f91\uff0c\u81f3\u5c11\u8ba9\u7b80\u5355\u7f16\u8bd1\u7684\u90a3\u6bb5\u4ee3\u7801\u80fd\u591f\u8dd1\u8d77\u6765\u3002<\/p>\n<h2 dir=\"auto\">mark \u51fd\u6570<\/h2>\n<p dir=\"auto\">\u7b80\u5355\u7f16\u8bd1\u540e\u7684\u4ee3\u7801\u7b2c\u4e00\u6bb5\u662f\u8fd9\u6837\u7684\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var _marked = \/*#__PURE__*\/ regeneratorRuntime.mark(helloWorldGenerator);\">\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">_marked<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c\">\/*#__PURE__*\/<\/span> <span class=\"pl-s1\">regeneratorRuntime<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">mark<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">helloWorldGenerator<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6211\u4eec\u67e5\u770b\u5b8c\u6574\u7f16\u8bd1\u7248\u672c\u4e2d mark \u51fd\u6570\u7684\u6e90\u7801\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"runtime.mark = function(genFun) {\n  genFun.__proto__ = GeneratorFunctionPrototype;\n  genFun.prototype = Object.create(Gp);\n  return genFun;\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-s1\">runtime<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">mark<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">genFun<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-s1\">genFun<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">__proto__<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">GeneratorFunctionPrototype<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-s1\">genFun<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prototype<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">Object<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">create<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-v\">Gp<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">genFun<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u5176\u4e2d\u53c8\u6d89\u53ca\u4e86 GeneratorFunctionPrototype \u548c Gp \u53d8\u91cf\uff0c\u6211\u4eec\u4e5f\u67e5\u770b\u4e0b\u5bf9\u5e94\u7684\u4ee3\u7801\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='function Generator() {}\nfunction GeneratorFunction() {}\nfunction GeneratorFunctionPrototype() {}\n\n...\n\nvar Gp = GeneratorFunctionPrototype.prototype =\n  Generator.prototype = Object.create(IteratorPrototype);\n\nGeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n\nGeneratorFunctionPrototype.constructor = GeneratorFunction;\n\nGeneratorFunctionPrototype[toStringTagSymbol] =\n  GeneratorFunction.displayName = \"GeneratorFunction\";'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-v\">Generator<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-v\">GeneratorFunction<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-v\">GeneratorFunctionPrototype<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-kos\">.<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-kos\">.<\/span>\n\n<span class=\"pl-c1\">var<\/span> <span class=\"pl-v\">Gp<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">GeneratorFunctionPrototype<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prototype<\/span> <span class=\"pl-c1\">=<\/span>\n  <span class=\"pl-v\">Generator<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prototype<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">Object<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">create<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-v\">IteratorPrototype<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-v\">GeneratorFunction<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prototype<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">Gp<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">constructor<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">GeneratorFunctionPrototype<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-v\">GeneratorFunctionPrototype<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">constructor<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">GeneratorFunction<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-v\">GeneratorFunctionPrototype<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">toStringTagSymbol<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">=<\/span>\n  <span class=\"pl-v\">GeneratorFunction<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">displayName<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"GeneratorFunction\"<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u6bb5\u4ee3\u7801\u6784\u5efa\u4e86\u4e00\u5806\u770b\u8d77\u6765\u5f88\u590d\u6742\u7684\u5173\u7cfb\u94fe\uff0c\u5176\u5b9e\u8fd9\u662f\u53c2\u7167\u7740 <a href=\"https:\/\/www.ecma-international.org\/ecma-262\/6.0\/#sec-generatorfunction-constructor\" rel=\"nofollow\">ES6 \u89c4\u8303<\/a>\u6784\u5efa\u7684\u5173\u7cfb\u94fe:<\/p>\n<p dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"\/\/www.lccc.top\/wp-content\/uploads\/pic\/mqyqingfen\/23cedc64948597e41162ff1e447331b35d7ed8d8.jpg\"><img decoding=\"async\" src=\"\/\/www.lccc.top\/wp-content\/uploads\/pic\/mqyqingfen\/23cedc64948597e41162ff1e447331b35d7ed8d8.jpg\" alt=\"regenerator\" data-canonical-src=\"https:\/\/cdn.jsdelivr.net\/gh\/mqyqingfeng\/Blog\/Images\/ES6\/regenerator\/regenerator.png\" style=\"max-width: 100%;\"><\/a><\/p>\n<p dir=\"auto\">\u56fe\u4e2d <code class=\"notranslate\">+@@toStringTag:s = 'Generator'<\/code> \u7684\u5c31\u662f Gp\uff0c<code class=\"notranslate\">+@@toStringTag:s = 'GeneratorFunction'<\/code> \u7684\u5c31\u662f GeneratorFunctionPrototype\u3002<\/p>\n<p dir=\"auto\">\u6784\u5efa\u5173\u7cfb\u94fe\u7684\u76ee\u7684\u5728\u4e8e\u5224\u65ad\u5173\u7cfb\u7684\u65f6\u5019\u80fd\u591f\u8ddf\u539f\u751f\u7684\u4fdd\u6301\u4e00\u81f4\uff0c\u5c31\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function* f() {}\nvar g = f();\nconsole.log(g.__proto__ === f.prototype); \/\/ true\nconsole.log(g.__proto__.__proto__ === f.__proto__.prototype); \/\/ true\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span><span class=\"pl-c1\">*<\/span> <span class=\"pl-s1\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span>\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">g<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">g<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">__proto__<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s1\">f<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prototype<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ true<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">g<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">__proto__<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">__proto__<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s1\">f<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">__proto__<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prototype<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ true<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4e3a\u4e86\u7b80\u5316\u8d77\u89c1\uff0c\u6211\u4eec\u53ef\u4ee5\u628a Gp \u5148\u8bbe\u7f6e\u4e3a\u4e00\u4e2a\u7a7a\u5bf9\u8c61\uff0c\u4e0d\u8fc7\u6b63\u5982\u4f60\u5728\u4e0a\u56fe\u4e2d\u770b\u5230\u7684\uff0cnext()\u3001 throw()\u3001return() \u51fd\u6570\u90fd\u662f\u6302\u8f7d\u5728 Gp \u5bf9\u8c61\u4e0a\uff0c\u5b9e\u9645\u4e0a\uff0c\u5728\u5b8c\u6574\u7684\u7f16\u8bd1\u4ee3\u7801\u4e2d\uff0c\u786e\u5b9e\u6709\u4e3a Gp \u6dfb\u52a0\u8fd9\u4e09\u4e2a\u51fd\u6570\u7684\u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='\/\/ 117 \u884c\nfunction defineIteratorMethods(prototype) {\n  [\"next\", \"throw\", \"return\"].forEach(function(method) {\n    prototype[method] = function(arg) {\n      return this._invoke(method, arg);\n    };\n  });\n}\n\n\/\/ 406 \u884c\ndefineIteratorMethods(Gp);'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ 117 \u884c<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">defineIteratorMethods<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">prototype<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-kos\">[<\/span><span class=\"pl-s\">\"next\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"throw\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"return\"<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">forEach<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">method<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-s1\">prototype<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">method<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">_invoke<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">method<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-c\">\/\/ 406 \u884c<\/span>\n<span class=\"pl-en\">defineIteratorMethods<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-v\">Gp<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4e3a\u4e86\u7b80\u5355\u8d77\u89c1\uff0c\u6211\u4eec\u5c06\u6574\u4e2a mark \u51fd\u6570\u7b80\u5316\u4e3a\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"runtime.mark = function(genFun) {\n  var generator = Object.create({\n    next: function(arg) {\n      return this._invoke('next', arg)\n    }\n  });\n  genFun.prototype = generator;\n  return genFun;\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-s1\">runtime<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">mark<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">genFun<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">generator<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">Object<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">create<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">next<\/span>: <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">_invoke<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">'next'<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n  <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-s1\">genFun<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prototype<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">generator<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">genFun<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">wrap \u51fd\u6570<\/h2>\n<p dir=\"auto\">\u9664\u4e86\u8bbe\u7f6e\u5173\u7cfb\u94fe\u4e4b\u5916\uff0cmark \u51fd\u6570\u7684\u8fd4\u56de\u503c genFun \u8fd8\u4f5c\u4e3a\u4e86 wrap \u51fd\u6570\u7684\u7b2c\u4e8c\u4e2a\u53c2\u6570\u4f20\u5165\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function helloWorldGenerator() {\n  return regeneratorRuntime.wrap(\n    function helloWorldGenerator$(_context) {\n      ...\n    },\n    _marked,\n    this\n  );\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">helloWorldGenerator<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">regeneratorRuntime<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">wrap<\/span><span class=\"pl-kos\">(<\/span>\n    <span class=\"pl-k\">function<\/span> <span class=\"pl-en\">helloWorldGenerator$<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n      ...\n    <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-s1\">_marked<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-smi\">this<\/span>\n  <span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6211\u4eec\u518d\u770b\u4e0b wrap \u51fd\u6570\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function wrap(innerFn, outerFn, self) {\n  var generator = Object.create(outerFn.prototype);\n  var context = new Context([]);\n  generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n  return generator;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">wrap<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">innerFn<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">outerFn<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">self<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">generator<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">Object<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">create<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">outerFn<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prototype<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">context<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-k\">new<\/span> <span class=\"pl-v\">Context<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-s1\">generator<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">_invoke<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">makeInvokeMethod<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">innerFn<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">self<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">generator<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6240\u4ee5\u5f53\u6267\u884c <code class=\"notranslate\">var hw = helloWorldGenerator();<\/code> \u7684\u65f6\u5019\uff0c\u5176\u5b9e\u6267\u884c\u7684\u662f wrap \u51fd\u6570\uff0cwrap \u51fd\u6570\u8fd4\u56de\u4e86 generator\uff0cgenerator \u662f\u4e00\u4e2a\u5bf9\u8c61\uff0c\u539f\u578b\u662f <code class=\"notranslate\">outerFn.prototype<\/code>, <code class=\"notranslate\">outerFn.prototype<\/code> \u5176\u5b9e\u5c31\u662f <code class=\"notranslate\">genFun.prototype<\/code>\uff0c <code class=\"notranslate\">genFun.prototype<\/code> \u662f\u4e00\u4e2a\u7a7a\u5bf9\u8c61\uff0c\u539f\u578b\u4e0a\u6709 next() \u65b9\u6cd5\u3002<\/p>\n<p dir=\"auto\">\u6240\u4ee5\u5f53\u4f60\u6267\u884c <code class=\"notranslate\">hw.next()<\/code> \u7684\u65f6\u5019\uff0c\u6267\u884c\u7684\u5176\u5b9e\u662f hw \u539f\u578b\u7684\u539f\u578b\u4e0a\u7684 next \u51fd\u6570\uff0cnext \u51fd\u6570\u6267\u884c\u7684\u53c8\u662f hw \u7684 _invoke \u51fd\u6570\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"generator._invoke = makeInvokeMethod(innerFn, self, context);\">\n<pre class=\"notranslate\"><span class=\"pl-s1\">generator<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">_invoke<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">makeInvokeMethod<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">innerFn<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">self<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">innerFn \u5c31\u662f wrap \u5305\u88f9\u7684\u90a3\u4e2a\u51fd\u6570\uff0c\u5176\u5b9e\u5c31\u662f helloWordGenerato$ \u51fd\u6570\uff0c\u5450\uff0c\u5c31\u662f\u8fd9\u4e2a\u51fd\u6570\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='function helloWorldGenerator$(_context) {\n  while (1) {\n    switch ((_context.prev = _context.next)) {\n      case 0:\n        _context.next = 2;\n        return \"hello\";\n\n      case 2:\n        _context.next = 4;\n        return \"world\";\n\n      case 4:\n        return _context.abrupt(\"return\", \"ending\");\n\n      case 5:\n      case \"end\":\n        return _context.stop();\n    }\n  }\n}'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">helloWorldGenerator$<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">while<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">switch<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prev<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">next<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-k\">case<\/span> <span class=\"pl-c1\">0<\/span>:\n        <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">next<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-s\">\"hello\"<\/span><span class=\"pl-kos\">;<\/span>\n\n      <span class=\"pl-k\">case<\/span> <span class=\"pl-c1\">2<\/span>:\n        <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">next<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">4<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-s\">\"world\"<\/span><span class=\"pl-kos\">;<\/span>\n\n      <span class=\"pl-k\">case<\/span> <span class=\"pl-c1\">4<\/span>:\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">abrupt<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"return\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"ending\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n      <span class=\"pl-k\">case<\/span> <span class=\"pl-c1\">5<\/span>:\n      <span class=\"pl-k\">case<\/span> <span class=\"pl-s\">\"end\"<\/span>:\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">stop<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u800c context \u4f60\u53ef\u4ee5\u76f4\u63a5\u7406\u89e3\u4e3a\u8fd9\u6837\u4e00\u4e2a\u5168\u5c40\u5bf9\u8c61\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='var ContinueSentinel = {};\n\nvar context = {\n  done: false,\n  method: \"next\",\n  next: 0,\n  prev: 0,\n  abrupt: function(type, arg) {\n    var record = {};\n    record.type = type;\n    record.arg = arg;\n\n    return this.complete(record);\n  },\n  complete: function(record, afterLoc) {\n    if (record.type === \"return\") {\n      this.rval = this.arg = record.arg;\n      this.method = \"return\";\n      this.next = \"end\";\n    }\n\n    return ContinueSentinel;\n  },\n  stop: function() {\n    this.done = true;\n    return this.rval;\n  }\n};'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-v\">ContinueSentinel<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">context<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">done<\/span>: <span class=\"pl-c1\">false<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-c1\">method<\/span>: <span class=\"pl-s\">\"next\"<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-c1\">next<\/span>: <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-c1\">prev<\/span>: <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-en\">abrupt<\/span>: <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">type<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">record<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">type<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">type<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">arg<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">complete<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-en\">complete<\/span>: <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">afterLoc<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">type<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s\">\"return\"<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">rval<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">arg<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">arg<\/span><span class=\"pl-kos\">;<\/span>\n      <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">method<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"return\"<\/span><span class=\"pl-kos\">;<\/span>\n      <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">next<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"end\"<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-v\">ContinueSentinel<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-en\">stop<\/span>: <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">done<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">rval<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6bcf\u6b21 <code class=\"notranslate\">hw.next<\/code> \u7684\u65f6\u5019\uff0c\u5c31\u4f1a\u4fee\u6539 next \u548c prev \u5c5e\u6027\u7684\u503c\uff0c\u5f53\u5728 generator \u51fd\u6570\u4e2d return \u7684\u65f6\u5019\u4f1a\u6267\u884c abrupt\uff0cabrupt \u4e2d\u53c8\u4f1a\u6267\u884c complete\uff0c\u6267\u884c\u5b8c complete\uff0c\u56e0\u4e3a <code class=\"notranslate\">this.next = end<\/code> \u7684\u7f18\u6545\uff0c\u518d\u6267\u884c\u5c31\u4f1a\u6267\u884c stop \u51fd\u6570\u3002<\/p>\n<p dir=\"auto\">\u6211\u4eec\u6765\u770b\u4e0b makeInvokeMethod \u51fd\u6570\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var ContinueSentinel = {};\n\nfunction makeInvokeMethod(innerFn, self, context) {\n  var state = 'start';\n\n  return function invoke(method, arg) {\n\n    if (state === 'completed') {\n      return { value: undefined, done: true };\n    }\n\n    context.method = method;\n    context.arg = arg;\n\n    while (true) {\n\n      state = 'executing';\n\n      var record = {\n        type: 'normal',\n        arg: innerFn.call(self, context)\n      };\n      if (record.type === &quot;normal&quot;) {\n\n        state = context.done\n          ? 'completed'\n          : 'yield';\n\n        if (record.arg === ContinueSentinel) {\n          continue;\n        }\n\n        return {\n          value: record.arg,\n          done: context.done\n        };\n\n      }\n    }\n  };\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-v\">ContinueSentinel<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">makeInvokeMethod<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">innerFn<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">self<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">state<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">'start'<\/span><span class=\"pl-kos\">;<\/span>\n\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-k\">function<\/span> <span class=\"pl-en\">invoke<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">method<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n\n    <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">state<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s\">'completed'<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">value<\/span>: <span class=\"pl-c1\">undefined<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">done<\/span>: <span class=\"pl-c1\">true<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n\n    <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">method<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">method<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">arg<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-k\">while<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n\n      <span class=\"pl-s1\">state<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">'executing'<\/span><span class=\"pl-kos\">;<\/span>\n\n      <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">record<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-c1\">type<\/span>: <span class=\"pl-s\">'normal'<\/span><span class=\"pl-kos\">,<\/span>\n        <span class=\"pl-c1\">arg<\/span>: <span class=\"pl-s1\">innerFn<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">call<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">self<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span>\n      <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n      <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">type<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s\">\"normal\"<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n\n        <span class=\"pl-s1\">state<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">done<\/span>\n          ? <span class=\"pl-s\">'completed'<\/span>\n          : <span class=\"pl-s\">'yield'<\/span><span class=\"pl-kos\">;<\/span>\n\n        <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">arg<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-v\">ContinueSentinel<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n          <span class=\"pl-k\">continue<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">{<\/span>\n          <span class=\"pl-c1\">value<\/span>: <span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">arg<\/span><span class=\"pl-kos\">,<\/span>\n          <span class=\"pl-c1\">done<\/span>: <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">done<\/span>\n        <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n      <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-kos\">}<\/span>\n  <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u57fa\u672c\u7684\u6267\u884c\u8fc7\u7a0b\u5c31\u4e0d\u5206\u6790\u4e86\uff0c\u6211\u4eec\u91cd\u70b9\u770b\u7b2c\u4e09\u6b21\u6267\u884c <code class=\"notranslate\">hw.next()<\/code> \u7684\u65f6\u5019:<\/p>\n<p dir=\"auto\">\u7b2c\u4e09\u6b21\u6267\u884c <code class=\"notranslate\">hw.next()<\/code> \u7684\u65f6\u5019\uff0c\u5176\u5b9e\u6267\u884c\u4e86<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='this._invoke(\"next\", undefined);'>\n<pre class=\"notranslate\"><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">_invoke<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"next\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">undefined<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6211\u4eec\u5728 invoke \u51fd\u6570\u4e2d\u6784\u5efa\u4e86\u4e00\u4e2a record \u5bf9\u8c61\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='var record = {\n  type: \"normal\",\n  arg: innerFn.call(self, context)\n};'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">record<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">type<\/span>: <span class=\"pl-s\">\"normal\"<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-c1\">arg<\/span>: <span class=\"pl-s1\">innerFn<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">call<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">self<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u800c\u5728 <code class=\"notranslate\">innerFn.call(self, context)<\/code> \u4e2d\uff0c\u56e0\u4e3a _context.next \u4e3a 4 \u7684\u7f18\u6545\uff0c\u5176\u5b9e\u6267\u884c\u4e86:<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"_context.abrupt(&quot;return&quot;, 'ending');\">\n<pre class=\"notranslate\"><span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">abrupt<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"return\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">'ending'<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u800c\u5728 abrupt \u4e2d\uff0c\u6211\u4eec\u53c8\u6784\u5efa\u4e86\u4e00\u4e2a record \u5bf9\u8c61\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var record = {};\nrecord.type = 'return';\nrecord.arg = 'ending';\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">record<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">type<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">'return'<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">arg<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">'ending'<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u7136\u540e\u6267\u884c\u4e86 <code class=\"notranslate\">this.complete(record)<\/code>\uff0c<\/p>\n<p dir=\"auto\">\u5728 complete \u4e2d\uff0c\u56e0\u4e3a <code class=\"notranslate\">record.type === \"return\"<\/code><\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"this.rval = 'ending';\nthis.method = &quot;return&quot;;\nthis.next = &quot;end&quot;;\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">rval<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">'ending'<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">method<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"return\"<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">next<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"end\"<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u7136\u540e\u8fd4\u56de\u4e86\u5168\u5c40\u5bf9\u8c61 ContinueSentinel\uff0c\u5176\u5b9e\u5c31\u662f\u4e00\u4e2a\u5168\u5c40\u7a7a\u5bf9\u8c61\u3002<\/p>\n<p dir=\"auto\">\u7136\u540e\u5728 invoke \u51fd\u6570\u4e2d\uff0c\u56e0\u4e3a <code class=\"notranslate\">record.arg === ContinueSentinel<\/code> \u7684\u7f18\u6545\uff0c\u6ca1\u6709\u6267\u884c\u540e\u9762\u7684 return \u8bed\u53e5\uff0c\u5c31\u76f4\u63a5\u8fdb\u5165\u4e0b\u4e00\u4e2a\u5faa\u73af\u3002<\/p>\n<p dir=\"auto\">\u4e8e\u662f\u53c8\u6267\u884c\u4e86\u4e00\u904d <code class=\"notranslate\">innerFn.call(self, context)<\/code>\uff0c\u6b64\u65f6 <code class=\"notranslate\">_context.next<\/code> \u4e3a end, \u6267\u884c\u4e86 <code class=\"notranslate\">_context.stop()<\/code>, \u5728 stop \u51fd\u6570\u4e2d\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"this.done = true;\nreturn this.rval; \/\/ this.rval \u5176\u5b9e\u5c31\u662f `ending`\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">done<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">rval<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ this.rval \u5176\u5b9e\u5c31\u662f `ending`<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6240\u4ee5\u6700\u7ec8\u8fd4\u56de\u7684\u503c\u4e3a:<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  value: 'ending',\n  done: true\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">value<\/span>: <span class=\"pl-s\">'ending'<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-c1\">done<\/span>: <span class=\"pl-c1\">true<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4e4b\u540e\uff0c\u6211\u4eec\u518d\u6267\u884c hw.next() \u7684\u65f6\u5019\uff0c\u56e0\u4e3a state \u5df2\u7ecf\u662f &#8216;completed&#8217; \u7684\u7f18\u6545\uff0c\u76f4\u63a5\u5c31\u8fd4\u56de <code class=\"notranslate\">{ value: undefined, done: true}<\/code><\/p>\n<h2 dir=\"auto\">\u4e0d\u5b8c\u6574\u4f46\u53ef\u7528\u7684\u6e90\u7801<\/h2>\n<p dir=\"auto\">\u5f53\u7136\u8fd9\u4e2a\u8fc7\u7a0b\uff0c\u770b\u6587\u5b57\u7406\u89e3\u8d77\u6765\u53ef\u80fd\u6709\u4e9b\u96be\u5ea6\uff0c\u4e0d\u5b8c\u6574\u4f46\u53ef\u7528\u7684\u4ee3\u7801\u5982\u4e0b\uff0c\u4f60\u53ef\u4ee5\u65ad\u70b9\u8c03\u8bd5\u67e5\u770b\u5177\u4f53\u7684\u8fc7\u7a0b\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='(function() {\n  var ContinueSentinel = {};\n\n  var mark = function(genFun) {\n    var generator = Object.create({\n      next: function(arg) {\n        return this._invoke(\"next\", arg);\n      }\n    });\n    genFun.prototype = generator;\n    return genFun;\n  };\n\n  function wrap(innerFn, outerFn, self) {\n    var generator = Object.create(outerFn.prototype);\n\n    var context = {\n      done: false,\n      method: \"next\",\n      next: 0,\n      prev: 0,\n      abrupt: function(type, arg) {\n        var record = {};\n        record.type = type;\n        record.arg = arg;\n\n        return this.complete(record);\n      },\n      complete: function(record, afterLoc) {\n        if (record.type === \"return\") {\n          this.rval = this.arg = record.arg;\n          this.method = \"return\";\n          this.next = \"end\";\n        }\n\n        return ContinueSentinel;\n      },\n      stop: function() {\n        this.done = true;\n        return this.rval;\n      }\n    };\n\n    generator._invoke = makeInvokeMethod(innerFn, context);\n\n    return generator;\n  }\n\n  function makeInvokeMethod(innerFn, context) {\n    var state = \"start\";\n\n    return function invoke(method, arg) {\n      if (state === \"completed\") {\n        return { value: undefined, done: true };\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        state = \"executing\";\n\n        var record = {\n          type: \"normal\",\n          arg: innerFn.call(self, context)\n        };\n\n        if (record.type === \"normal\") {\n          state = context.done ? \"completed\" : \"yield\";\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n        }\n      }\n    };\n  }\n\n  window.regeneratorRuntime = {};\n\n  regeneratorRuntime.wrap = wrap;\n  regeneratorRuntime.mark = mark;\n})();\n\nvar _marked = regeneratorRuntime.mark(helloWorldGenerator);\n\nfunction helloWorldGenerator() {\n  return regeneratorRuntime.wrap(\n    function helloWorldGenerator$(_context) {\n      while (1) {\n        switch ((_context.prev = _context.next)) {\n          case 0:\n            _context.next = 2;\n            return \"hello\";\n\n          case 2:\n            _context.next = 4;\n            return \"world\";\n\n          case 4:\n            return _context.abrupt(\"return\", \"ending\");\n\n          case 5:\n          case \"end\":\n            return _context.stop();\n        }\n      }\n    },\n    _marked,\n    this\n  );\n}\n\nvar hw = helloWorldGenerator();\n\nconsole.log(hw.next());\nconsole.log(hw.next());\nconsole.log(hw.next());\nconsole.log(hw.next());'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-kos\">(<\/span><span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">var<\/span> <span class=\"pl-v\">ContinueSentinel<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n  <span class=\"pl-k\">var<\/span> <span class=\"pl-en\">mark<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">genFun<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">generator<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">Object<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">create<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-en\">next<\/span>: <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">_invoke<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"next\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n      <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-s1\">genFun<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prototype<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">generator<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">genFun<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n  <span class=\"pl-k\">function<\/span> <span class=\"pl-en\">wrap<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">innerFn<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">outerFn<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">self<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">generator<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">Object<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">create<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">outerFn<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prototype<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">context<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-c1\">done<\/span>: <span class=\"pl-c1\">false<\/span><span class=\"pl-kos\">,<\/span>\n      <span class=\"pl-c1\">method<\/span>: <span class=\"pl-s\">\"next\"<\/span><span class=\"pl-kos\">,<\/span>\n      <span class=\"pl-c1\">next<\/span>: <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">,<\/span>\n      <span class=\"pl-c1\">prev<\/span>: <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">,<\/span>\n      <span class=\"pl-en\">abrupt<\/span>: <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">type<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">record<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">type<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">type<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">arg<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">;<\/span>\n\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">complete<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n      <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span>\n      <span class=\"pl-en\">complete<\/span>: <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">afterLoc<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">type<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s\">\"return\"<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n          <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">rval<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">arg<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">arg<\/span><span class=\"pl-kos\">;<\/span>\n          <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">method<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"return\"<\/span><span class=\"pl-kos\">;<\/span>\n          <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">next<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"end\"<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-v\">ContinueSentinel<\/span><span class=\"pl-kos\">;<\/span>\n      <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span>\n      <span class=\"pl-en\">stop<\/span>: <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">done<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">rval<\/span><span class=\"pl-kos\">;<\/span>\n      <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-s1\">generator<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">_invoke<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">makeInvokeMethod<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">innerFn<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">generator<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n\n  <span class=\"pl-k\">function<\/span> <span class=\"pl-en\">makeInvokeMethod<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">innerFn<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">state<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"start\"<\/span><span class=\"pl-kos\">;<\/span>\n\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-k\">function<\/span> <span class=\"pl-en\">invoke<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">method<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">state<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s\">\"completed\"<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">value<\/span>: <span class=\"pl-c1\">undefined<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">done<\/span>: <span class=\"pl-c1\">true<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n      <span class=\"pl-kos\">}<\/span>\n\n      <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">method<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">method<\/span><span class=\"pl-kos\">;<\/span>\n      <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">arg<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">arg<\/span><span class=\"pl-kos\">;<\/span>\n\n      <span class=\"pl-k\">while<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-s1\">state<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"executing\"<\/span><span class=\"pl-kos\">;<\/span>\n\n        <span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">record<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n          <span class=\"pl-c1\">type<\/span>: <span class=\"pl-s\">\"normal\"<\/span><span class=\"pl-kos\">,<\/span>\n          <span class=\"pl-c1\">arg<\/span>: <span class=\"pl-s1\">innerFn<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">call<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">self<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">)<\/span>\n        <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n        <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">type<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s\">\"normal\"<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n          <span class=\"pl-s1\">state<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">done<\/span> ? <span class=\"pl-s\">\"completed\"<\/span> : <span class=\"pl-s\">\"yield\"<\/span><span class=\"pl-kos\">;<\/span>\n\n          <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">arg<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-v\">ContinueSentinel<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-k\">continue<\/span><span class=\"pl-kos\">;<\/span>\n          <span class=\"pl-kos\">}<\/span>\n\n          <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">{<\/span>\n            <span class=\"pl-c1\">value<\/span>: <span class=\"pl-s1\">record<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">arg<\/span><span class=\"pl-kos\">,<\/span>\n            <span class=\"pl-c1\">done<\/span>: <span class=\"pl-s1\">context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">done<\/span>\n          <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n      <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n\n  <span class=\"pl-smi\">window<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">regeneratorRuntime<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n  <span class=\"pl-s1\">regeneratorRuntime<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">wrap<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">wrap<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-s1\">regeneratorRuntime<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">mark<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">mark<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">_marked<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">regeneratorRuntime<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">mark<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">helloWorldGenerator<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">helloWorldGenerator<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">regeneratorRuntime<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">wrap<\/span><span class=\"pl-kos\">(<\/span>\n    <span class=\"pl-k\">function<\/span> <span class=\"pl-en\">helloWorldGenerator$<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n      <span class=\"pl-k\">while<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">switch<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prev<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">next<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n          <span class=\"pl-k\">case<\/span> <span class=\"pl-c1\">0<\/span>:\n            <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">next<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-k\">return<\/span> <span class=\"pl-s\">\"hello\"<\/span><span class=\"pl-kos\">;<\/span>\n\n          <span class=\"pl-k\">case<\/span> <span class=\"pl-c1\">2<\/span>:\n            <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">next<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">4<\/span><span class=\"pl-kos\">;<\/span>\n            <span class=\"pl-k\">return<\/span> <span class=\"pl-s\">\"world\"<\/span><span class=\"pl-kos\">;<\/span>\n\n          <span class=\"pl-k\">case<\/span> <span class=\"pl-c1\">4<\/span>:\n            <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">abrupt<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"return\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"ending\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n          <span class=\"pl-k\">case<\/span> <span class=\"pl-c1\">5<\/span>:\n          <span class=\"pl-k\">case<\/span> <span class=\"pl-s\">\"end\"<\/span>:\n            <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">_context<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">stop<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n        <span class=\"pl-kos\">}<\/span>\n      <span class=\"pl-kos\">}<\/span>\n    <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-s1\">_marked<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-smi\">this<\/span>\n  <span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">hw<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">helloWorldGenerator<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">hw<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">next<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">hw<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">next<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">hw<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">next<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">hw<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">next<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">ES6 \u7cfb\u5217<\/h2>\n<p dir=\"auto\">ES6 \u7cfb\u5217\u76ee\u5f55\u5730\u5740\uff1a<a href=\"https:\/\/github.com\/mqyqingfeng\/Blog\">https:\/\/github.com\/mqyqingfeng\/Blog<\/a><\/p>\n<p dir=\"auto\">ES6 \u7cfb\u5217\u9884\u8ba1\u5199\u4e8c\u5341\u7bc7\u5de6\u53f3\uff0c\u65e8\u5728\u52a0\u6df1 ES6 \u90e8\u5206\u77e5\u8bc6\u70b9\u7684\u7406\u89e3\uff0c\u91cd\u70b9\u8bb2\u89e3\u5757\u7ea7\u4f5c\u7528\u57df\u3001\u6807\u7b7e\u6a21\u677f\u3001\u7bad\u5934\u51fd\u6570\u3001Symbol\u3001Set\u3001Map \u4ee5\u53ca Promise \u7684\u6a21\u62df\u5b9e\u73b0\u3001\u6a21\u5757\u52a0\u8f7d\u65b9\u6848\u3001\u5f02\u6b65\u5904\u7406\u7b49\u5185\u5bb9\u3002<\/p>\n<\/td>\n<p>\u6587\u7ae0\u8f6c\u8f7d\u81ea<a href='https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/102'>https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/102<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u8a00 \u672c\u6587\u5c31\u662f\u7b80\u5355\u4ecb\u7ecd\u4e0b Generator \u8bed\u6cd5\u7f16\u8bd1\u540e\u7684\u4ee3\u7801\u3002 Generator function* helloWorldGenerator() { yie&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.lccc.top\/?p=1361\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1361","post","type-post","status-publish","format-standard","hentry","category-learn"],"_links":{"self":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1361"}],"collection":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1361"}],"version-history":[{"count":1,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1361\/revisions"}],"predecessor-version":[{"id":1480,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1361\/revisions\/1480"}],"wp:attachment":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1361"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1361"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}