2011-02-09

JavaScript の内部関数が便利すぎる件

ちょっとした関数を作る時、一部処理が冗長だなと思っても、

わざわざ外に出して関数化するほどのことでもないよな、とか

この関数からしか呼ばないのに、並列に関数を置きたくないな、とか思うことがあるでしょう。

JavaScript ならこんな思いに見事に答えてくれます

たとえば個人情報が云々なので文字列マスク処理を作ろうとしましょう。

String.prototype.mask = function() {

  var maskedText = "";
  for(var ix = 0; ix < this.length; ix++){
    maskedText += mask1(this.substring(ix, 1));
  }

  return maskedText;

  function mask1(character) {
    var maskedCharacter = "";
    swith(chr) {
     case 数字:
      処理A, 個別処理
     case 英字:
      処理B, 個別処理
     case数字:
      処理A, 個別処理
     case 全英字:
      処理B, 個別処理
     case ひらがな:
      処理C, 個別処理
     case カタカナ:
      処理C, 個別処理
     case 漢字:
      処理D, 個別処理
     default:
      未処理
    }

    return maskedCharacter;
  }
};

こういうメソッドを作った時、処理A、処理B、処理Cは冗長な処理になっているわけです

個別処理があるのでbreakしなければいいや、というわけでもありません。

しかしこの処理A,B,Cはこの関数外に置くような処理でもないわけです

この関数内でしか使いませんし、むしろ使って欲しくないわけです

  function mask1(character) {
    var maskedCharacter = "";
    swith(chr) {
     case 数字:
      shoriA(), 個別処理
     case 英字:
      shoriB(), 個別処理
     case数字:
      shoriA(), 個別処理
     case 全英字:
      shoriB(), 個別処理
     case ひらがな:
      shoriC(), 個別処理
     case カタカナ:
      shoriC(), 個別処理
     case 漢字:
      処理D, 個別処理
     default:
      未処理
    }

    return maskedCharacter;

    function shoriA() { 処理A }
    function shoriB() { 処理B }
    function shoriC() { 処理C }
  }

こう書けるのです

JavaScript で一番好きなのはこの内部関数です

  • それ、メンバメソッドっていうんだよね普通は。

  • 関数内に関数が書けるのはPascalやLispの頃から出来てたんだよな。 なぜPascalでできていたのにCでは書けなくしてしまったのか、 まあローカル変数にアクセスできないInnter Functionなんてあ...

    • よく知らんけど、単に関数が1級オブジェクトかどうかの違いってことじゃないの? 要するに関数型言語なのかそうじゃないのかの違い。 なんで全部関数型にならなかったのかはもっと...

    • JavaScript ではローカル変数にアクセスできるけど、 たとえできなくても引数で与えればいいだけのように感じられる。 JavaScript の内部関数は this 値が変わるのが面白いよな、that = this な...

    • Cの場合は使わないからだろ。関数内に関数。 というか、Cの場合関数の粒度を気にすることが多いからね。 再帰関数 > ループでかけ みたいな感じで、関数コールを嫌う分化だからな...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん