它为什么有效? JS函数和var

时间:2014-04-17 16:34:22

标签: javascript function variables

在编写一些JS的过程中,脚本完全像我预期的那样工作,但在我给它提供数字之前。

现在数字IS在脚本中进一步说明了,我只是很好奇,这就是为什么这个有效? JS中的变量是否考虑了稍后在函数内声明的变量?

特定部分我很困惑:if (lastrowIDnumInt === 0)因为var没有声明并且在else之前给出了值。

请问是否有人可以解释这是否正确,如果是,请参考为什么?

下面是片段:

function voidall() {

    if (lastrowIDnumInt === 0){ // references lastrowIDnumInt, no tengo como haces without prior reference
        alert("You cannot remove any items that do not exist!");
    } else {
        var activetableID = $("li.till_table_button.active").attr('id');
        // alert(activetableID);
        var tablenumber = $("#"+activetableID).data("tableref");
        // alert(tablenumber); //testing

        var lastrowid = $( "#till__tablepanel_table_"+tablenumber+" tr:last").attr("id");
        var idReference = lastrowid.substr(0, lastrowid.indexOf('row_')); //gets the beggining id refernces without number
        // alert(idReference); //testing
        var fullReference = idReference+"row_";
        // alert(fullReference); //testing
        var lastrowIDnum = lastrowid.substring(lastrowid.indexOf("row_") + 4); //take number for row by removing string contents
        lastrowIDnumInt = parseInt(lastrowIDnum); //turn string number into integer

        while ( lastrowIDnumInt > 0 ) {
            $( "#till__tablepanel_table_"+tablenumber+" tr:last").remove();
            lastrowIDnumInt--;
        }
    }
}

2 个答案:

答案 0 :(得分:4)

函数中的所有var声明都被视为出现在函数顶部。它被称为“吊装”。

请注意,它是声明,它被视为顶部,而不是初始化。这意味着:

function foo() {
  if (something === 0) {
    alert("zero");
  }
  else {
    var something = 0;
    alert("not zero"); // <-- this
  }
}

这被视为看起来像这样:

function foo() {
  var something;
  if (something === 0) { // <-- undefined here
    alert("zero");
  }
  else {
    something = 0;
    alert("not zero"); // <-- this
  }
}

答案 1 :(得分:3)

因为var被提升到功能范围的顶部。换句话说,无论条件如何,您的变量都是定义的,但它们只会在else块中分配值。