jQueryのプラグインの書き方について質問です。

プラグインを作成する時に、
$.fn.extend({
 hoge: function(arg) {
  ...
  fuga(arg)
  ...
  
  function fuga(arg){
   ...
  }
 }
})
という書き方をするのは、hogeが呼び出される度にfugaが生成されるような気がするのですが、これはメモリの無駄使いになりますか?
こんな感じの書き方を
(function(){
$.fn.extend({
 hoge: function(arg) {
  ...
  fuga(arg)
  ...
 }
})
function fuga(arg){
 ...
}
})()
した方がよいのでしょうか?
それとも、jQueryやブラウザのjavascriptエンジンが良きに計らってくれているなどしていて、現実的にはさほど気にしなくても問題ないものなのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2011/07/14 11:29:18
  • 終了:2011/07/21 11:30:03

回答(0件)

回答はまだありません

  • id:mogya
    仮に、hogeが呼び出される度にfugaが生成されるとします。
    すると、fugaはhogeのローカルスコープの中ということになるので、関数から抜けた時点で解放されることになります。なので、別に無駄遣いにはなっていません。

    後者にすると、hogeと無関係にhugaが存在することになりますね。この場合、hogeを呼ばなくてもfugaが存在し続けますから、このやり方でメモり効率が良くなることはないです。
    処理時間は改善されるかもしれないですけど、たぶん実際にはあまりかわらんのではないかな、とおもいます。
  • id:Lhankor_Mhy
    id:mogyaさん、コメントありがとうございます。

    >fugaはhogeのローカルスコープの中ということになるので、関数から抜けた時点で解放される
     
    これは、そのクロージャの参照を保持するものがなくなった時にメモリを開放する、という理解の仕方でよろしいですか?
    そうなるとたとえば、hoge内部でfugaへの参照を保持し続ける処理があった場合は問題があるわけなんですね。まあ、それはまた別の問題か……
  • id:a-kuma3
    GC は、コストが高い処理なので、それほど頻繁には実行されません。
    少なくとも、スコープが外れたタイイングで、即、解放されるような実装は無いと思います。

    クロージャとしてのスコープがあるので、内側に宣言を書くと、
    それだけ Function のインスタンスが生成される、という理解で良いと思います。

    後は、それが無駄かどうか、という判断ですが、質問にあるコードの断片だけだと、
    影響度合いが分からない、というのが正直なところです。

    あくまで経験則なのですが、純粋な javascript のインスタンスだけのリークが、実際のコードで
    問題になることは、あまり無いと思います。
    コードは短いが、繰り返し実行されていることで、パフォーマンスに影響を与える、ということは
    往々にしてありますが、その場合には、HTML なインスタンスとペアで問題になることが多い、
    という気がします。
  • id:Lhankor_Mhy
    なるほど、よく分かりました。
    ガベージコレクションで回収されるまではメモリを消費してしまうけど、DOMを介した循環参照に気をつけていればそれほど問題になることは少ないと。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません