为什么我经常看到这种Javascript构造/约定?(即,在it和x27自己的行上创建';var foo;';,而不是通过分配)
我经常看到Javascript程序员这样做:为什么我经常看到这种Javascript构造/约定?(即,在it和x27自己的行上创建';var foo;';,而不是通过分配),javascript,Javascript,我经常看到Javascript程序员这样做: function(index, input) { var $input; $input = $(input); return $input.data('foo', 'bar'); } function(index, input) { var $input = $(input); return $input.data('foo', 'bar'); } 而我本以为会这样做: function(index, input) { v
function(index, input) {
var $input;
$input = $(input);
return $input.data('foo', 'bar');
}
function(index, input) {
var $input = $(input);
return $input.data('foo', 'bar');
}
而我本以为会这样做:
function(index, input) {
var $input;
$input = $(input);
return $input.data('foo', 'bar');
}
function(index, input) {
var $input = $(input);
return $input.data('foo', 'bar');
}
或者在这种特殊情况下,实际上是:
function(index, input) {
return $(input).data('foo', 'bar');
}
在一行上声明“var”,然后在以后分配给它们的值是多少?在我看来,添加额外的行只会导致可能的问题(例如,有人可能忘记添加“var”而意外地生成全局变量)。那么为什么要这样做呢
这只是某种类型的编码约定(可能是可读性?),还是JavaScript内部的工作方式存在一些微妙的问题,使得这个构造在某种程度上更加高效
在一行上声明“var”,然后在以后分配给它们的值是多少
没有。这样或那样都没有区别。就这么简单。我认为这只是一个风格问题。我也偏爱您的第二个示例,并且经常在同一个语句中声明和分配多个变量。我想不出有什么理由不这样做,我认为分离这两条语句只会在以后代码增长时引起混乱 在这个简单的例子中,正如我所说,它没有多大区别。但在javascript中,首先计算函数体中的var声明。因此,在函数顶部添加所有var声明是很有意义的,如果它们只是在以后使用的话
a = "GLOBAL";
function x(){
console.log(a);
var a = "VAR";
console.log(a);
}
x()
将打印
undefined
VAR
而不是
GLOBAL
VAR
假设有一个变量需要保留在范围内(或者处于严格模式),那么必须使用
var
声明变量。但是,您可能不使用该变量,这取决于某些条件。考虑:
var foo;
if(cond1) {
foo = "something";
} else if(cond2) {
foo = "something else";
} else if(cond3) {
foo = "a third thing";
}
如果没有打开var foo,您需要执行以下操作:
if(cond1) {
var foo = "something";
} else if(cond2) {
var foo = "something else";
} else if(cond3) {
var foo = "a third thing";
}
(这主要是出于维护方面的考虑——您可以只使用一个var foo=..
就可以了,其余的都是foo=..
,但是一旦您注释掉或更改了这种情况,foo
的行为就会改变。)
它看起来不太好,而且您已经在这个范围内无条件地声明了
foo
(因为声明是不正确的)。如果此代码被深埋在某个函数中,那么在第二种情况下,读者可能不清楚是否声明了foo
。取决于“以后”的最终含义。给出问题中的简单例子,没有区别。举一个更复杂的例子,有人会建议,声明函数顶部的所有变量不受“提升”行为的欺骗是一个很好的做法。我把这个问题解释为“declare、then assign或declare和assign之间有区别吗?”。没有。是的,我一直认为javascript范围规则有点奇怪。@javascript中的JoeEnos变量是函数范围的。除此之外,我喜欢范围界定规则汉克斯,这是一个实际的非三段论理由,它是有道理的。啊,你真是疯了!:)@Jon在哪里用过两次?这三种方法只使用一次examples@Ian看到第一个了吗revision@JanDvorak当然,我需要开始记住这一点;谢谢:)是的,我用错了例子。我想问的是现在这个问题,这有点不同。我理解你为什么需要这么做,在你提到的情况下,我只是没有看到它的用途,当你声明它,然后在一行之后使用它。这就是我在想的,但我不知道JavaScript解释器是否做了一些疯狂的事,比如在以一种方式声明对象与另一种方式声明对象时,可能没有垃圾收集对象,等等。