我被告知javascript变量应该在函数中使用之前完成,例如:
function contrived() {
var myA, myB;
myA = 10;
myB = 20;
return myA + myB;
}
优先选择:
function furtherContrivance() {
var myA = 10;
var myB = 20;
return myA + myB;
}
是这样的吗?那是为什么?
答案 0 :(得分:2)
这两者之间没有区别。我会选择:
function furtherContrivance() {
var myA = 10,
myB = 20;
return myA + myB;
}
在javascript中被称为single var pattern
。
您真正需要注意的是在函数的开头定义变量。 javascript中有一个名为variables hoisting
的东西,这意味着函数中使用的变量定义“up”在顶部。最好用一个例子来描述:
var x = 'global'; // global (bounded to a global object which is window in browsers)
function func() {
alert(x); // undefined (you expected 'global', right?)
var x = 'local';
alert(x); // local
}
func();
真正发生的事情被调用(如我所说)variables hoisting
(x
的定义在上面引发),所以上面的代码实际上与:
var x = 'global';
function func() {
var x; // definition of `x` raised on top (variables hoisting)
alert(x); // undefined in a local scope
x = 'local';
alert(x);
}
javscript解释器的作用是查看函数内部,收集本地定义的变量并将它们置于顶部 - 这可能是您使用single var pattern
的一个很好的理由。
答案 1 :(得分:2)
是的,变量声明应该位于函数的顶部:
function foo() {
var a, b;
}
但是,初始化变量可以是声明的一部分:
function foo() {
var a = 10, b = 20;
}
在函数顶部声明所有变量的原因是为了避免范围混淆。
以下是错误代码的示例:
function foo() {
var b;
for (var i = 0; i < 5; i++) {
var a;
a = b = i;
setTimeout(function(){
console.log(a, b);
}, 1000);
}
}
如果执行代码,它将记录4, 4
5次,而不是计数。这是因为仅函数充当闭包并引入新范围。在JavaScript中,函数中的任何var
声明都在函数的开头执行。
这使得上述错误更加明显:
function foo() {
var a, b, i;
for (i = 0; i < 5; i++) {
a = b = i;
setTimeout(function(){
console.log(a, b);
}, 1000);
}
}
答案 2 :(得分:0)
在示例中,您绝对不是这样。在像Javascript这样的语言中,它将更多地是开发人员的偏好,但它不会对结果产生任何影响。
答案 3 :(得分:0)
为了便于阅读,它绝对是首选。
但是,Javascript“提升”声明。吊装意味着变量和功能将自动移动到其范围的顶部。这允许您在声明之前执行诸如使用函数之类的事情:
function myScope()
{
test();
function test()
{
//...
}
}
这可能会导致一些混淆,特别是如果声明了块范围内的变量。例如:
for(var i in foo)
{
var e = myFunc();
}
e的声明将被提升到闭包的顶部,e将被初始化为undefined。这允许一些有趣的非直观情况,例如:
if(!foo) //Will not throw reference error because foo is declared already
{
var foo = {};
}
因此,无论你如何声明你的变量,他们都会“升级”到函数的顶部。
希望这有帮助!