Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我经常看到这种Javascript构造/约定?(即,在it和x27自己的行上创建';var foo;';,而不是通过分配)_Javascript - Fatal编程技术网

为什么我经常看到这种Javascript构造/约定?(即,在it和x27自己的行上创建';var foo;';,而不是通过分配)

为什么我经常看到这种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

我经常看到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) {
  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解释器是否做了一些疯狂的事,比如在以一种方式声明对象与另一种方式声明对象时,可能没有垃圾收集对象,等等。