2011-08-16 15 views
1

変数と関数をグローバルスコープに公開しないように、以下のJavaScriptコードを変更するにはどうすればよいですか?JavaScriptでグローバル変数と関数を使用しないようにする

var nMax = 10; 
var i = 0; 
var step = function(){ 
       //do stuff 
       i += 1; 
       if(i < nMax){ 
           step(); 
       }else{ 
           alert('finished'); 
       } 
} 
step(); 

その背後に理由がある場合は、理想的には感謝します。

どのようなアイデアをいただければ幸いです。

答えて

4

ただ、匿名関数でラップし、即座にその関数を呼び出します。

(function(){ 
    var nMax = 10; 
    var i = 0; 
    var step = function(){ 
        //do stuff 
        i += 1; 
        if(i < nMax){ 
            step(); 
        }else{ 
            alert('finished'); 
        } 
    } 
    step(); 
})(); 

もう一つの例:http://jsfiddle.net/n5Srd/

+0

D'oh。 * 6秒で私を打つ。実際、私のやり方では、関数名 'step'が公開されていました。 YMMV。 – Malvolio

+0

このように、私は無名関数の外で 'step'関数を使うことはできません。 – ShankarSangoli

+0

ハハええ私はこの1つに素早く:)彼はどのようにも機能を公開しないように頼んだ。 – Paulpro

2

標準的な方法は、

var step = function(){ 
    var nMax = 10; 
    var i = 0; 
    return function() { 
       //do stuff 
       i += 1; 
       if(i < nMax){ 
           step(); 
       }else{ 
           alert('finished'); 
       } 
    }; 
}(); 
step(); 
+0

これは、関数を外側のスコープから隠すこともありません。 – Paulpro

1

使用する代わりになりますクロージャ:関数はオブジェクトなので、他のオブジェクトと同じように関数に値を付けることができます:

function step() 
{ 
    step.i++; 

    if (step.i < step.nMax) step(); 
    else alert('finished'); 
} 

step(); 

あるいは、機能と変数を名前空間にオブジェクトを使用します。

var stepper = 
{ 
    i: 0, 
    nMax: 10, 
    step: function() 
    { 
     this.i++; 

     if (this.i < this.nMax) this.step(); 
     else alert('finished'); 
    } 
}; 

stepper.step(); 

そしてここで、関数宣言ではなく、関数式を使用しています@ PaulPROの答えのクリーナーバージョンがあります:

(function() 
{ 
    var i = 0, 
     nMax = 10; 

    function step() 
    { 
     i++; 

     if (i < nMax) step(); 
     else alert('finished'); 
    } 

    step(); 
})(); 
+0

真(+1)。しかし、* 1つの "ステップ"関数オブジェクトしかありません。したがって、振る舞いは望みどおりであるかもしれません... '' steps'を指定するのを避けるために '' arguments.callee''を使うこともできます... –

+0

あなたは正しいです(そして、おそらく既に私が言うことを知っているでしょう)。 ['arguments.callee'は避けるべきです。なぜなら、より良い、より効率的な、単純な代替案があるからです(https://developer.mozilla.org/ja/JavaScript/Reference/Functions_and_function_scope/arguments/callee)。 –

+0

これは、外部スコープから機能を隠すOPの問題を解決しません。彼が既にstepと呼ばれる関数を持っている場合、またはstepperという名前の変数が矛盾します。 – Paulpro

0

fnがそれを介して呼び出されるようにオブジェクトを配置します。 -

var stepHolder = {}; 
stepHolder.step = (function(nMax){ 
var i = 0; 
return function step(){ 
      //do stuff 
      i += 1; 
      if(i < nMax){ 
          step(); 
      }else{ 
          alert('finished'); 
      } 
    };} 
)(10); 

    stepHolder.step(); 
+0

その3はnMaxであり、1 – QuentinUK

+0

でなければなりません。スタックエクスチェンジサイトにはこの素晴らしい機能が['edit'](http://stackoverflow.com/posts/7073061/edit)あります。見てみな。 –

関連する問題