JS变量声明的类型

时间:2013-12-31 15:48:19

标签: javascript variables variable-assignment variable-declaration

因此在Javascript中,有两种方法可以声明单个变量:

  1. 声明var myVariable;然后在代码
  2. 中分配myVariable = 1234;
  3. 在一行var myVariable = 1234;
  4. 中声明和分配

    对于第一种方式,如果声明变量,则其值为undefined,直到将其赋值为值。因此,如果它还没有分配,它基本上是没有价值的。为什么有人会做第一种声明?

    在相关的说明中,为什么Javascript,我猜任何执行此操作的语言(C,C ++等)都有声明和赋值(相比之下,比如python-like赋值myVariable=1234),因为变量,即使在声明时,在分配之前是无用的吗?

6 个答案:

答案 0 :(得分:3)

  

为什么有人会做第一种声明?

通常会发生这种声明,以便从代码中的其他范围访问此变量。

//higher-scope variable
var name;

function setName(_name){
     //Usage at a lower scope
     name = _name;
}

用法:

    //Notice how I use the "higher scope" variable at the
    //function and out of the functions - different scopes!

        setName("David");
        alert(name);

答案 1 :(得分:3)

您的变量将保持undefined,直到解释器到达为其指定值的行。

所有变量和函数在运行时都是hoisted到各自范围的顶部。基本上,当脚本启动时,您在该页面上的每个变量都将被声明为未定义,并保持不变,直到它在某处找到=符号。

Here's a much more in-depth explanation for you :)

滚动一点hoisting部分,但老实说,整件事情是非常重要的。

答案 2 :(得分:2)

有时人们喜欢将所有变量声明分组到函数的顶部,以便模仿“变量提升”实际发生的情况。

如果尚未知道所需的初始化值,那么很明显它不能用该值初始化。

答案 3 :(得分:1)

以下是您可以执行的操作示例:

var myfunc = function(flag){
    var myvar;
    if(flag) myvar = 42;
    else myvar = 0;
    return myvar;
}

所以你看,你的myvar是未定义的。并没有充分的理由。另一个例子

var myvar;
(function(){
    myvar = 42;
})()

在另一个剧本中:

alert(myvar);

这里的var将是全局的,而它是在一个不对称的函数中定义的。

答案 4 :(得分:1)

可以这样做,因为你并不总是需要为它分配东西,但是已经想要定义变量。如果您稍后要分配它,这将非常有用。例如:

var myValue;
if (condition) {
    myValue = 'myString1';
} else {
    myValue = 'myString2';
}

您不希望首先为变量赋值,但您确实希望进一步使用它。然后,您可以将定义放在if语句之外,然后根据if语句为其分配不同的内容。当然这个例子过于简单了,但在与此类似的情况下,这样做可能很有用。

如果您需要创建全局变量,这也很有用:

(function scope() {
    var x;
    document.getElementById('myId').addEventListener('click', function(e) {
        x = this.innerHTML;
    });
})();

现在变量x可以在范围界定中的任何地方使用。

答案 5 :(得分:1)

这里有一些你不想要的东西。 :

1)所有变量声明都由JS interpeter提升到函数的顶部,因此所有变量都是未定义的,直到被分配,甚至是在函数后面的同一语句中声明和赋值的变量。这称为“可变提升”,是Javascript语言的一个特性。因此,在函数顶部定义的变量与函数后面定义的变量之间没有功能差异。影响函数可能行为的唯一因素是为变量赋值。

因此,由于变量“hoisting”,这样的函数有两个内联变量声明:

function(array) {
    for (var i = 0; i < array.length; i++) {
        var el = array[i];
        if (el > 3) {
            array[i] = el * el;
        }
    }
}

实际上是由js解释器处理的(其中所有变量声明都被提升到函数的开头):

function(array) {
    var i, el;
    for (i = 0; i < array.length; i++) {
        el = array[i];
        if (el > 3) {
            array[i] = el * el;
        }
    }
}

2)undefined的变量有一个值。该值为undefined,可能很有用。例如,它是假的,因此它可以在if语句或任何布尔测试中进行测试,或者甚至可以明确地测试它以查看它是否为undefined。这是一个例子:

function processIfNegative(array) {
    var foundNegative;
    array.foreach(function(el) {
        if (el < 0) {
            foundNegative = true;
        }
    });
    if (foundNegative) {
        // do some processing
    }
}

现在,出于可读性目的,我可能会将foundNegative初始化为false,但这不是必需的,因为undefined已经falsey

或者,这是一个显式检查undefined值的示例。

function processLowestPositive(array) {
    var lowestValue;
    array.foreach(function(el) {
        if (el >= 0) { 
            if (lowestValue === undefined) {
                lowestValue = el;
            } else if (el < lowestValue) {
                lowestValue = el;
            }
        }
    });
    // if there was a positive value found
    if (lowestValue !== undefined) {
        // process the lowest positive value
    }
}

注意:在明确测试undefined值时,我总是使用===!==,因此没有类型转换,我确定该值实际为{{1} }。