14

好的,我在这里阅读了几个标题相同的问题,但仍然找不到解决我的问题的方法。我正在开发一个基本的 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新手请温柔。谢谢。

4

2 回答 2

14

您不应该传入函数a的参数timer来访问全局变量a。当a传递给定时器函数时,使用全局变量的值,但在定时器中,参数变量是定时器函数的局部变量,改变它的值不会改变全局变量的值。这意味着您的代码中有两个变量,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;
}
于 2013-10-01T18:38:10.930 回答
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 页面

于 2013-10-01T18:40:35.983 回答