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 の ->
みたいの、なんでないのだろう?