如何更改下面的JavaScript代码,以避免将变量和函数暴露给全局范围?
var nMax = 10;
var i = 0;
var step = function(){
//do stuff
i += 1;
if(i < nMax){
step();
}else{
alert('finished');
}
}
step();
理想情况下,如果可以提供背后的理由,我们将不胜感激。
任何想法都会非常感激!
答案 0 :(得分:4)
将其包装在匿名函数中,并立即调用该函数:
(function(){
var nMax = 10;
var i = 0;
var step = function(){
//do stuff
i += 1;
if(i < nMax){
step();
}else{
alert('finished');
}
}
step();
})();
答案 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();