1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

once,memoize,invokeを書いてみる

Last updated at Posted at 2025-10-18

once

  • 1度しか使えない関数を返す
    クロージャを使う

      _.once = (funk) => {
      let called = false;
      let returnFunk = undefined;
      return (...args) => {
      if(!called) {
      returnFunk = funk(...args);
      called = true;
      return returnFunk;
      }
      };`
    
  • called = 1度でも呼び出ししたかを判定

  • returnFunc = 1回目の呼び出しで実行し、結果をreturnFuncに入れる

  • 2回目以降は、trueなので、すでにfuncが実行された状態の値 = returnFuncを返す

memoize

  • 引数として関数をとる

  • 引数の関数の引数が何かを記憶し、
    記憶した引数と同じ引数が来たときは、過去の関数の実行結果を返す

      `_.memoize = (func) => {
      const resultObj = {};
      return (n) => {
      if(resultObj[n] === undefined) {
      resultObj[n] = func(n);
      }
      return resultObj[n];
      }`
    
  • オブジェクトで、引数とその引数を渡して実行した関数の結果を管理

  • 内部の関数の引数に渡されたnをキーにした値がresultObjに存在するか確認

  • もし存在しなければnを引数にした関数の実行結果をnをキーにして値に設定

  • 必ずresultObjに保存されるので、最後にはresultObj[n]を返せば良い

invoke

    `_.invoke = (collection,functionOrString) => {
    if(typeof functionOrString === "function") {
    return _.map(collection,(val) => {
    return functionOrString(val).apply(val));
    }else {
    return _.map(colection,(val) => {
    return val[functionOrString].apply(val));
    }
    };`
  • "sort"のような文字列の場合に
    メソッドとして呼び出すには、["sort"]のように呼び出せば良い
    (javascriptオブジェクトのメソッドを呼び出す = ドット記法とブラケット記法両方呼べる)
  • applyはthisを指定できる
  • val[sort]したときに、thisが何かわからなくなるので、val[sort].apply[val]
  • でval = 配列をthisに指定する必要がある

今回、混乱したポイント

  • mapとの違い
  • なぜapplyする必要があるか?

mapは、自分で定義した関数を、配列の各要素に実行する
invokeは、例えばsortなどの自身配列が持っているメソッドを使うので、array.sortの様に誰がsortを呼んだのかのthisが必要になる

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?