音の鳴るブログ

鳴らないこともある

JavaScript の this が分からない

ライブラリをES6で書いて公開する所から始めよう | Web Scratch

この記事を読んで、よっしゃ僕も練習がてらライブラリのES6化するぞ!!と思って、とりあえず既存ライブラリのテストだけでもES6化しようと思って脳内コーディングをしたところ、ライブラリ作者にとって Arrow Function が意外と厄介なんじゃないかと感じた。

(実際に試したわけではないので、全体的に勘違いしている可能性があります)

例えば、ちょっと雑いけど以下のようなテストコード。

describe("test", function() {
  it("Math.random", sinon.test(function() { // <- test sandbox
    this.stub(Math, "random", function() {
      return 0.5;
    });
    assert(Math.random() === 0.5);
  }));
  // sinon.test を使えばテストが失敗しても書き換えたスタブは元に戻る
});

sinon の sandbox は this を書き変えるので Arrow Function (this が外側のスコープに束縛される) は使えない。結果 function=> が混在して嫌な感じがする。デンジャラスメル。

describe("test", ()=>{
  it("Math.random", sinon.test(function() { // <- Arrow Function が使えない
    this.stub(Math, "random", ()=>{
      return 0.5;
    });
    assert(Math.random() === 0.5);
  }));
});

これの対処は以下のどちらかになると思うのだけど。まあ後者だろうなぁと思う。

  • ライブラリ使用者が Function式 と Arrow Function を使い分ける
  • ライブラリ作者が call とか apply を使わない

sinon のインターフェースを自分なりに修正するならこんな感じにすると思う。this に頼らず、それ相当のインターフェースを引数として別途提供するみたいな感じ。

describe("test", ()=>{
  it("Math.random", sinon.test((sinon)=>{
    sinon.stub(Math, "random", ()=>{
      return 0.5;
    });
    assert(Math.random() === 0.5);
  }));
});

っていうか CoffeeScript-> みたいの、なんでないのだろう?