2011-08-16 67 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。擊敗我*六秒*。實際上,我的方式公開了函數名'step',我認爲這是OP想要的。因人而異。 – Malvolio

+0

這樣我就不能在匿名函數之外使用'step'函數。 – ShankarSangoli

+0

哈哈是啊,我很快在這一個:)他問如何不暴露該功能。 – 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

True(+1)。但是,只有*一個*「step」函數對象。因此,行爲可能會或可能不會按照需要......也可以使用'arguments.callee'來避免指定'step' ... – 2011-08-16 01:58:22

+0

你說得對(可能已經知道我要說什麼了),但['arguments.callee'應該避免,因爲有更好,更高效,簡單的替代方法](https://developer.mozilla.org/en/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,應該是10 – QuentinUK

+0

堆棧交換站點有這個奇妙的功能稱爲['edit'](http://stackoverflow.com/posts/7073061/edit)。一探究竟。 –