Javascript倒计时关闭问题

时间:2015-10-26 20:01:27

标签: javascript closures countdown

我有一个for循环,我得到倒计时的起始编号。我想在for循环之外使用那个数字,这就是闭包问题。

for (var i = 0; i < response.length; i++) {
    var number = response[i].number; //the number is 10
    getNumber(number);
};

所以我认为我应该调用一个返回该数字的函数,以便我可以在其他地方使用它:

function getNumber(number) {
    return number;
}

但是当我尝试这样做时,我得到一个未定义而不是10:

var globalVariableForNumber = getNumber();

我知道我做错了是在为我的变量赋值时调用没有参数的getNumber(),但我该怎么做呢?

该号码来自ajax调用,其中包含更多数字(response [i] .number)。然后我想用这些数字作为倒计时的开始计时器。所以,如果数字是10,那么我的倒计时将从10开始。 谢谢。

3 个答案:

答案 0 :(得分:0)

var response = [
  {number:5},
  {number:6},
  {number:7},
  {number:8},
  {number:9},
  {number:10}
]

var number;
for (var i = 0; i < response.length; i++) {
    number = response[i].number; //the number is 10
    console.log(getNumber());
};
function getNumber() {
    return number;
}

// try it again later...
console.log(getNumber());

同样,你应该直接拨打号码。但是出于这个问题的目的,你必须在更高的范围内声明number

enter image description here

答案 1 :(得分:0)

您正在做的是创建一个只接受一个参数的函数,并在调用该参数时返回该参数。返回是一种奇特的说法,如果您说foo=bar(),那么foo就是bar()返回的内容。

在您的代码中,调用没有参数的getNumber()会返回undefined,因为它只返回参数。你应该做的不是返回参数,而是像这样设置全局变量:

function getNumber(number) {
    globalVariableForNumber = number;
}

现在,通过运行来获取号码:

globalVariableForNumber

答案 2 :(得分:0)

范围

  

当前的执行环境。价值观和背景   表达式是“可见的”,或者可以被引用。如果变量或   其他表达式不是“在当前范围内”,则它不可用   用来。范围也可以分层次结构,以便孩子   范围可以访问父范围,但反之亦然。

     

一个函数在JavaScript中用作闭包,从而创建一个   范围,以便(例如)一个仅在其中定义的变量   无法从函数外部或其他函数访问函数   功能

考虑可以声明和调用代码的范围示例:

function ImInGlobalScope(){ //Function declared in global scope

 //Lets call this block 1
 for (var i = 0; i < response.length; i++) {
    var number = response[i].number; //Inside function scope
    getNumber(number)
 };

 //Lets call this block 2
 function getNumber(number){ //In same scope than for statement
    return number; //block 3
 }

}

var globalVariableForNumber = getNumber();

使用此示例,getNumber未定义,因为它属于ImInGlobalScope()范围。考虑代码范围的另一种情况。

function ImInGlobalScope(){ //Function declared in global scope

 //Lets call this block 1
 for (var i = 0; i < response.length; i++) {
    var number = response[i].number; //Inside function scope
    getNumber(number)
 };

}

 //Lets call this block 2
 function getNumber(number){ //In same scope than for statement
    return number; //block 3
 }

var globalVariableForNumber = getNumber();

我相信以上是你的场景:getNumber在全局范围内,但是数字是ImInGlobalScope()。

所以当你打电话给var globalVariableForNumber = getNumber();时我们有以下内容:

 function getNumber(number){ //Number is not being passed so is undefined
    return number; //no variable named number exists in this scope so it will return undefined.
 }