2017年4月22日土曜日

開発環境

メタプログラミングRuby 第2版(Paolo Perrotta (著)、角 征典 (翻訳)、オライリージャパン)の1部(メタプログラミング Ruby)、4章(水曜日: ブロック)、4.3(ブロックはクロージャ)、4.3.1(スコープ)、グローバル変数、4.3.3(スコープのフラット化)、スコープの共有を JavaScript で取り組んでみる。

HTML5

<pre id="output0"></pre>
<button id="run0">run</button>
<button id="clear0">clear</button>

<script src="sample2.js"></script>

JavaScript

let btn0 = document.querySelector('#run0'),
    btn1 = document.querySelector('#clear0'),
    pre0 = document.querySelector('#output0'),
    p = (x) => pre0.textContent += x + '\n';

let value;
let aScope = () => {
    value = 'some value';
};
let anotherScoe = () => value;

let myVar = '成功';
let MyClass = () => {
    let that = {},
        myMethod = () => `メソッド定義のなかも${myVar}!`;

    that.myMethod = myMethod;
    
    p(`クラス定義のなかは${myVar}!`);
    
    return that;
};

let defineMethods = () => {
    let shared = 0;
    
    window.counter = () => shared;
    window.inc = (x) => shared += x;
};

let output = () => {
    p('4.3 ブロックはクロージャ');
    let myMethod = (fn) => {
        let x = 'Goodbye';
        
        return fn('cruel');
    };
    let x = 'Hello';
    p(myMethod((y) => `${x}, ${y} world`));

    let justYield = (fn) => {
        return fn();
    };
    let toLevelVariable = 1;
    justYield(() => {
        toLevelVariable += 1;
        let localToBlock = 1;
    });
    p (toLevelVariable);    
    try {
        p(localToBlock);
    } catch (e) {
        p(e);
    }
    p('グローバル変数');
    p(value);
    aScope();
    p(value);
    p(anotherScoe());

    p('4.3.3 スコープのフラット化');
    p(MyClass().myMethod());

    p('スコープの共有');
    defineMethods();
    p(counter());
    inc(4);
    p(counter());
};

btn0.onclick = output;
btn1.onclick = () => pre0.textContent = '';

output();




  









						

0 コメント:

コメントを投稿