どうも。つじけ(tsujikenzo)です。このシリーズでは2021年8月からスタートしました「ノンプロ研EffectiveJavaScript輪読会」についてお送りします。
前回のおさらい
前回は、「コードをカプセル化するには、文字列ではなくクロージャを使う」をお届けしました。
今回は、「関数のtoStringメソッドに依存するのは避けよう」 をお届けします。
テキスト第3章「関数の扱い」の項目28に対応しています。※担当回です。気合いが入ります。
今日のアジェンダ
- 神のお告げ
- ソースコードを文字列で表現する
- 組み込みオブジェクトの中身を参照する
- 衝撃の事実
神のお告げ
今日の項目は、こんな出だしから始まります。
「JavaScriptの関数には注目すべき機能がある」
なんてワクワクさせる文でしょう。神様からわたしへのプレゼントなのでしょう。さっそく考察を始めます。
ソースコードを文字列で表現する
ソースコードは、文字列で表現できます。
それが、toString()メソッドです。※アロー関数では使えないので注意です。
function myFunction4_28_01() {
const func = function (x) { return x + 1; }.toString();
console.log(func); //function (x) { return x + 1; }
//アロー関数では使えない
// const func = x => x + 1;.toString();
}
ソースコードを文字列で表現するということは、組み込みメソッドなど、すでに実装されているメソッドの中身が見れるということなのでしょう。
ほんとうにそんなことができるのでしょうか。
わたしのワクワクはうなぎのぼりです。
組み込みオブジェクトの中身を参照する
Functionオブジェクトのメンバーである、bindメソッドの戻り値は、this
の値と初期の引数を指定された関数のコピーです。
function myFunction4_28_02() {
const reciever = {};
const func = (function (x) { return x + 1; }).bind(reciever);
console.log(func); // [Function: bound ]
}
この、得体の知れない関数boundの中身を見てみましょう。ドキドキ
すると、このように、[native code] と表示されるようです。
全つじけがガッカリしています。。。
function myFunction4_28_03() {
const reciever = {};
const func = (function (x) { return x + 1; }).bind(reciever);
console.log(func); // [Function: bound ]
console.log(func.toString()); //function () { [native code] }
}
衝撃の事実
そして、読み進めていくうちに、どんどんテンションが下がります。
クロージャを表現できないそうですが、もはや、ふーんそうですか、という感情です。
//クロージャを表現できない
function myFunction4_28_04() {
const func2 = (y) => { return x + y };
//xに42を結合する即時関数
const func = (function (x) { return func2 })(42).toString();
console.log(func); // (y) => { return x + y }
}
なぜなら、この項目の最後に 「一般に、関数でtoStringを使うのは避けるべきだ」 と書いているからです。
つまり、こういうことです。
「JavaScriptの関数には注目すべき機能がある」
「その機能を使うのは避けるべきだ」
まとめ
以上で、「関数のtoStringメソッドに依存するのは避けよう」をお届けしました。
こんな回もあるでしょう。
次回は、「非標準のスタック調査プロパティを使うのは避けよう」 をお届けします。
参考資料
このシリーズの目次
- [EffectiveJavaScript輪読会4]固定レシーバを持つメソッドを抽出するにはbindを使う
- [EffectiveJavaScript輪読会4]関数をカリー化するには、bindを使う
- [EffectiveJavaScript輪読会4]コードをカプセル化するには、文字列ではなくクロージャを使う
- [EffectiveJavaScript輪読会4]関数のtoStringメソッドに依存するのは避けよう
- [EffectiveJavaScript輪読会4]非標準のスタック調査プロパティを使うのは避けよう
- [EffectiveJavaScript輪読会4]prototype、getPrototypeOf、__proto__の違いを理解する
- [EffectiveJavaScript輪読会4]__proto__は決して変更しないこと