概要
ブロック文のようでありながら、かつ中に書かれた最後の式の評価を返すdo式が実装された。
基本
let foo = do { // ブロックスコープを作る let x = 1 + 1 // 中に文(や式)を記述できる x + 3 // 最後に評価された式がdo式の結果となる function fn(){} // 文は評価されない } console.log(foo) // 5
但しfor文やwhile文などは少し注意が必要で、
まず初期化部、条件部、更新部の評価はdo式が返す値にならない。
let bar = do { for (let i = 1; i <= 10; i++) i } // 実際の最後の式評価は (11 <= 10) => false console.log(bar) // 10
そして処理部に何も書かれていない場合でも、undefinedと評価される。
let baz = do { 123 for (let i = 1; i <= 10; i++) ; } console.log(baz) // undefined
利用例
ES6: 即時関数
//...... let n = (() => { let n = 0 for (let i = 1; i <= 10; i++) { n += i } return n })() // 55 //......
↓
ES7: do式
//...... let n = do { let n = 0 for (let i = 1; i <= 10; i++) { n += i } } // 55 //......
ES6: 即時関数
let Foo = (() => { //...... return class Foo { //...... } })()
↓
ES7: do式
let Foo = do { //...... ;(class Foo { // 関数やクラスの宣言文は評価されないので、式として評価させる //...... }) }
アロー関数と組み合わせる
ES6:
let plus = (a, b) => { console.log(a, b) return a + b }
↓
ES7:
let plus = (a, b) => do { console.log(a, b), a + b }
実装されるバージョン
V8 4.8.121