Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Revision 1032716 of Generator

  • Revision slug: Web/JavaScript/Reference/Global_Objects/Generator
  • Revision title: Generator
  • Revision id: 1032716
  • Created:
  • Creator: panhezeng
  • Is current revision? Yes
  • Comment

Revision Content

{{JSRef}}

The Generator object is returned by a {{jsxref("Statements/function*", "generator function", "", 1)}} and it conforms to both the iterable protocol and the iterator protocol.

Syntax

function* gen() { 
  yield 1;
  yield 2;
  yield 3;
}

var g = gen(); // "Generator { }"

Methods

{{jsxref("Generator.prototype.next()")}}
Returns a value yielded by the {{jsxref("Operators/yield", "yield")}} expression.
{{jsxref("Generator.prototype.return()")}}
Returns the given value and finishes the generator.
{{jsxref("Generator.prototype.throw()")}}
Throws an error to a generator.

Example

An infinite iterator

function* idMaker(){
    var index = 0;
    while(true)
        yield index++;
}

var gen = idMaker(); // "Generator { }"

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// ...

Legacy generator objects

Firefox (SpiderMonkey) also implements an earlier version of generators in JavaScript 1.7, where the star (*) in the function declaration was not necessary (you just use the yield keyword in the function body). However, legacy generators are deprecated. Do not use them; they are going to be removed ({{bug(1083482)}}).

Legacy generator methods

Generator.prototype.next() {{non-standard_inline}}
Returns a value yielded by the {{jsxref("Operators/yield", "yield")}} expression. This corresponds to next() in the ES6 generator object.
Generator.prototype.close() {{non-standard_inline}}
Closes the generator, so that when calling next() an {{jsxref("StopIteration")}} error will be thrown. This corresponds to the return() method in the ES6 generator object.
Generator.prototype.send() {{non-standard_inline}}
Used to send a value to a generator. The value is returned from the {{jsxref("Operators/yield", "yield")}} expression, and returns a value yielded by the next {{jsxref("Operators/yield", "yield")}} expression. send(x) corresponds to next(x) in the ES6 generator object.
Generator.prototype.throw() {{non-standard_inline}}
Throws an error to a generator. This corresponds to the throw() method in the ES6 generator object.

Legacy generator example

function* fibonacci() {
  var a = yield 1;
  yield a * 2;
}

var it = fibonacci();
console.log(it);          // "Generator {  }"
console.log(it.next());   // 1
console.log(it.send(10)); // 20
console.log(it.close());  // undefined
console.log(it.next());   // throws StopIteration (as the generator is now closed)

Specifications

Specification Status Comment
{{SpecName('ES6', '#sec-generator-objects', 'Generator objects')}} {{Spec2('ES6')}} Initial definition.
{{SpecName('ESDraft', '#sec-generator-objects', 'Generator objects')}} {{Spec2('ESDraft')}}  

Browser compatibility

{{CompatibilityTable}}

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support {{CompatChrome(39.0)}} {{CompatVersionUnknown}} {{CompatNo}} {{CompatNo}} {{CompatNo}}
Feature Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support {{CompatNo}} {{CompatChrome(39.0)}} {{CompatVersionUnknown}} {{CompatNo}} {{CompatNo}} {{CompatNo}} {{CompatChrome(39.0)}}

See also

Legacy generators

  • {{jsxref("Statements/Legacy_generator_function", "The legacy generator function", "", 1)}}
  • {{jsxref("Operators/Legacy_generator_function", "The legacy generator function expression", "", 1)}}
  • {{jsxref("StopIteration")}}
  • The legacy Iterator protocol

ES6 generators

  • {{jsxref("Functions", "Functions", "", 1)}}
  • {{jsxref("Statements/function", "function")}}
  • {{jsxref("Operators/function", "function expression")}}
  • {{jsxref("Function")}}
  • {{jsxref("Statements/function*", "function*")}}
  • {{jsxref("Operators/function*", "function* expression")}}
  • {{jsxref("GeneratorFunction")}}
  • The Iterator protocol

Revision Source

<div>{{JSRef}}</div>

<p>The <code><strong>Generator</strong></code> object is returned by a {{jsxref("Statements/function*", "generator function", "", 1)}}&nbsp;and it conforms to both the <a href="/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable">iterable protocol</a> and the <a href="/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterator">iterator protocol</a>.</p>

<h2 id="Syntax">Syntax</h2>

<pre class="syntaxbox">
function* gen() { 
  yield 1;
  yield 2;
  yield 3;
}

var g = gen(); // "Generator { }"</pre>

<h2 id="Methods">Methods</h2>

<dl>
 <dt>{{jsxref("Generator.prototype.next()")}}</dt>
 <dd>Returns a value yielded by the {{jsxref("Operators/yield", "yield")}} expression.</dd>
 <dt>{{jsxref("Generator.prototype.return()")}}</dt>
 <dd>Returns the given value and finishes the generator.</dd>
 <dt>{{jsxref("Generator.prototype.throw()")}}</dt>
 <dd>Throws an error to a generator.</dd>
</dl>

<h2 id="Example">Example</h2>

<h3 id="An_infinite_iterator">An infinite iterator</h3>

<pre class="brush: js">
function* idMaker(){
    var index = 0;
    while(true)
        yield index++;
}

var gen = idMaker(); // "Generator { }"

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// ...</pre>

<h2 id="Legacy_generator_objects">Legacy generator objects</h2>

<p>Firefox (SpiderMonkey) also implements an earlier version of generators in <a href="/en-US/docs/Web/JavaScript/New_in_JavaScript/1.7">JavaScript 1.7</a>, where the star (*) in the function declaration was not necessary (you just use the <code>yield</code> keyword in the function body). However, legacy generators are deprecated. Do not use them; they are going to be removed ({{bug(1083482)}}).</p>

<h3 id="Legacy_generator_methods">Legacy generator methods</h3>

<dl>
 <dt><code>Generator.prototype.next() </code>{{non-standard_inline}}</dt>
 <dd>Returns a value yielded by the {{jsxref("Operators/yield", "yield")}} expression. This corresponds to <code>next()</code> in the ES6 generator object.</dd>
 <dt><code>Generator.prototype.close()</code> {{non-standard_inline}}</dt>
 <dd>Closes the generator, so that when calling <code>next()</code> an {{jsxref("StopIteration")}} error will be thrown. This corresponds to the <code>return()</code> method in the ES6 generator object.</dd>
 <dt><code>Generator.prototype.send()</code> {{non-standard_inline}}</dt>
 <dd>Used to send a value to a generator. The value is returned from the {{jsxref("Operators/yield", "yield")}} expression, and returns a value yielded by the next {{jsxref("Operators/yield", "yield")}} expression. <code>send(x)</code> corresponds to <code>next(x)</code> in the ES6 generator object.</dd>
 <dt><strong><code>Generator.</code></strong><code>prototype.</code><strong><code>throw()</code> </strong> {{non-standard_inline}}</dt>
 <dd>Throws an error to a generator. This corresponds to the <code>throw()</code> method in the ES6 generator object.</dd>
</dl>

<h3 id="Legacy_generator_example">Legacy generator example</h3>

<pre class="brush: js">
function* fibonacci() {
  var a = yield 1;
  yield a * 2;
}

var it = fibonacci();
console.log(it);          // "Generator {  }"
console.log(it.next());   // 1
console.log(it.send(10)); // 20
console.log(it.close());  // undefined
console.log(it.next());   // throws StopIteration (as the generator is now closed)
</pre>

<h2 id="Specifications">Specifications</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Specification</th>
   <th scope="col">Status</th>
   <th scope="col">Comment</th>
  </tr>
  <tr>
   <td>{{SpecName('ES6', '#sec-generator-objects', 'Generator objects')}}</td>
   <td>{{Spec2('ES6')}}</td>
   <td>Initial definition.</td>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-generator-objects', 'Generator objects')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td>&nbsp;</td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility">Browser compatibility</h2>

<p>{{CompatibilityTable}}</p>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Chrome</th>
   <th>Firefox (Gecko)</th>
   <th>Internet Explorer</th>
   <th>Opera</th>
   <th>Safari</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatChrome(39.0)}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Android</th>
   <th>Android Webview</th>
   <th>Firefox Mobile (Gecko)</th>
   <th>IE Mobile</th>
   <th>Opera Mobile</th>
   <th>Safari Mobile</th>
   <th>Chrome for Android</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatChrome(39.0)}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatNo}}</td>
   <td>{{CompatChrome(39.0)}}</td>
  </tr>
 </tbody>
</table>
</div>

<h2 id="See_also">See also</h2>

<h3 id="Legacy_generators">Legacy generators</h3>

<ul>
 <li>{{jsxref("Statements/Legacy_generator_function", "The legacy generator function", "", 1)}}</li>
 <li>{{jsxref("Operators/Legacy_generator_function", "The legacy generator function expression", "", 1)}}</li>
 <li>{{jsxref("StopIteration")}}</li>
 <li><a href="/en-US/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features/The_legacy_Iterator_protocol">The legacy Iterator protocol</a></li>
</ul>

<h3 id="ES6_generators">ES6 generators</h3>

<ul>
 <li>{{jsxref("Functions", "Functions", "", 1)}}</li>
 <li>{{jsxref("Statements/function", "function")}}</li>
 <li>{{jsxref("Operators/function", "function expression")}}</li>
 <li>{{jsxref("Function")}}</li>
 <li>{{jsxref("Statements/function*", "function*")}}</li>
 <li>{{jsxref("Operators/function*", "function* expression")}}</li>
 <li>{{jsxref("GeneratorFunction")}}</li>
 <li><a href="/en-US/docs/Web/JavaScript/Guide/The_Iterator_protocol">The Iterator protocol</a></li>
</ul>
Revert to this revision