javascript setInterval()和Variable Scope

时间:2013-10-01 18:35:45

标签: javascript jquery variables global-variables

好的,我在这里看了几个问题但标题相同,但仍无法找到解决问题的方法。我正在研究一个基本的javascript倒计时器,我一直在更新a变量的值。

a = 100;
var i = setInterval( function(){ timer( a ); }, 1000 );

function timer( a ){
    console.log( a );
    if( a < 1 ){     
        console.log( 'Reaching Stop' ); 
            clearInterval( i );
            return;         
    } 
    a -= 1;
}

当我将a的值递减-1时,console.log( a )每次应减少1,即

100 99 98 ......

console.log( a )始终提供100

新手到这里javascript请温柔。 感谢。

2 个答案:

答案 0 :(得分:10)

您不应在a函数的参数中传递timer来访问全局变量a。当a传递给timer函数时,使用全局变量的值但是在timer中,参数变量是timer函数的本地变量,并且更改它的值不会改变全局变量的值。这意味着您的代码中有两个变量,名称为a,一个是全局的,另一个是定时器函数的本地变量,您正在更改定时器的局部变量值。

a = 100;
var i = setInterval( timer, 1000 );

function timer() {
    console.log( a );
    if ( a < 1 ) {
        console.log( 'Reaching Stop' ); 
        clearInterval( i );
        return;         
    } 
    a -= 1;
}

答案 1 :(得分:2)

当您将变量作为参数传递给函数时,您将创建一个闭包,为该变量创建新的范围。

由于变量是全局变量,因此您无需将其传递给:

http://jsfiddle.net/FBVTT/

var a = 100;
var i = setInterval(timer, 1000);

function timer() {
    console.log(a);
    if (a < 1) {
        console.log('Reaching Stop');
        clearInterval(i);
        return;
    }
    a -= 1;
}

这是一个MDN page on closures