因此在Javascript中,有两种方法可以声明单个变量:
var myVariable;
然后在代码myVariable = 1234;
var myVariable = 1234;
对于第一种方式,如果声明变量,则其值为undefined
,直到将其赋值为值。因此,如果它还没有分配,它基本上是没有价值的。为什么有人会做第一种声明?
在相关的说明中,为什么Javascript,我猜任何执行此操作的语言(C,C ++等)都有声明和赋值(相比之下,比如python-like赋值myVariable=1234
),因为变量,即使在声明时,在分配之前是无用的吗?
答案 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
到各自范围的顶部。基本上,当脚本启动时,您在该页面上的每个变量都将被声明为未定义,并保持不变,直到它在某处找到=
符号。
滚动一点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} }。