避免在Javascript中使用全局变量和函数

时间:2011-08-16 01:52:25

标签: javascript

如何更改下面的JavaScript代码,以避免将变量和函数暴露给全局范围?

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

理想情况下,如果可以提供背后的理由,我们将不胜感激。

任何想法都会非常感激!

4 个答案:

答案 0 :(得分: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/

答案 1 :(得分:2)

标准方式是

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

答案 2 :(得分: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();

这里是@PaperPRO答案的更清晰版本,它使用函数声明而不是函数表达式:

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

    function step()
    {
        i++;

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

    step();
})();

答案 3 :(得分: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();