在javascript中,有没有一种方法可以将索引值保持在函数的本地

在javascript中,有没有一种方法可以将索引值保持在函数的本地,javascript,global-variables,closures,scope,Javascript,Global Variables,Closures,Scope,在本例中,是否有任何方法可以防止索引成为全局变量: var arr = [1, 2, 3, 4, 5]; var index = 0; function run() { console.log(arr[index]); if(++index == arr.length) index = 0; } 似乎每次检查都必须是全局的,但我想知道是否有什么巧妙的方法可以绕过全局变量。您可以使用a(此处使用a创建): 但是由于arr也是全局的,所以在我看来这并不是一个巨大的改进。如果数组应该

在本例中,是否有任何方法可以防止
索引
成为全局变量:

var arr = [1, 2, 3, 4, 5];
var index = 0;
function run() {
    console.log(arr[index]);
    if(++index == arr.length) index = 0;
}
似乎每次检查都必须是全局的,但我想知道是否有什么巧妙的方法可以绕过全局变量。

您可以使用a(此处使用a创建):

但是由于
arr
也是全局的,所以在我看来这并不是一个巨大的改进。如果数组应该是静态数据,那么最好(从代码组织的角度)将数组作为参数传递给函数,或者在IIFE中定义它

或者,您可以将
索引
设置为函数的属性,因为函数只是对象。这样做的缺点是(?)索引可以从外部更改(并且函数的实现依赖于函数的名称,该名称也可以更改(可以使用命名函数表达式来解决)):

您可以使用(此处使用创建):

但是由于
arr
也是全局的,所以在我看来这并不是一个巨大的改进。如果数组应该是静态数据,那么最好(从代码组织的角度)将数组作为参数传递给函数,或者在IIFE中定义它

或者,您可以将
索引
设置为函数的属性,因为函数只是对象。这样做的缺点是(?)索引可以从外部更改(并且函数的实现依赖于函数的名称,该名称也可以更改(可以使用命名函数表达式来解决)):


通常,可以通过讨论的各种名称空间模式避免Javascript中的变量

例如,下面是一个显示模块模式的示例,可用于防止索引变量以及其他Javascript对象处于全局范围内:

var namespace = (function () {

    // defined within the local scope
    var arr = [1, 2, 3, 4, 5];
    var index = 0;
    function run() {
       console.log(arr[index]);
        if(++index == arr.length) index = 0;
    }

    return {
        run: run
    }
})();

然后可以通过说namespace.run()调用run方法

通常,可以通过讨论的各种名称空间模式避免Javascript中的变量

例如,下面是一个显示模块模式的示例,可用于防止索引变量以及其他Javascript对象处于全局范围内:

var namespace = (function () {

    // defined within the local scope
    var arr = [1, 2, 3, 4, 5];
    var index = 0;
    function run() {
       console.log(arr[index]);
        if(++index == arr.length) index = 0;
    }

    return {
        run: run
    }
})();

然后可以通过说namespace.run()调用run方法

不需要重置计数器,对吗
arr[i++%arr.length]
对,除非有可能
i
溢出。我想在这种语法中,你总是把结尾放在最后。也就是说,
var run=(function(){console.log('ran');})(
,你所说的
I
“溢出”是什么意思。此外,我还听到过关于使用
%
if
的速度有多快的矛盾观点:你在这个问题上有立场吗?@Startec:我现在不担心性能,尤其是如果你也在某处做DOM操作的话。JS可以精确表示的最大整数值是
9007199254740992
。添加此值将不再产生任何有意义的结果,因此模运算也无法正常工作。但是怀疑
run
是否会在一次页面加载中执行
9007199254740992
次,这样您就没事了。我只是为了完整性才提到;)不需要重置计数器,对吗
arr[i++%arr.length]
对,除非有可能
i
溢出。我想在这种语法中,你总是把结尾放在最后。也就是说,
var run=(function(){console.log('ran');})(
,你所说的
I
“溢出”是什么意思。此外,我还听到过关于使用
%
if
的速度有多快的矛盾观点:你在这个问题上有立场吗?@Startec:我现在不担心性能,尤其是如果你也在某处做DOM操作的话。JS可以精确表示的最大整数值是
9007199254740992
。添加此值将不再产生任何有意义的结果,因此模运算也无法正常工作。但是怀疑
run
是否会在一次页面加载中执行
9007199254740992
次,这样您就没事了。我只是为了完整性才提到;)
var namespace = (function () {

    // defined within the local scope
    var arr = [1, 2, 3, 4, 5];
    var index = 0;
    function run() {
       console.log(arr[index]);
        if(++index == arr.length) index = 0;
    }

    return {
        run: run
    }
})();