2

我经常看到 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) {
  return $(input).data('foo', 'bar');
}

在一行上声明“var”,然后再分配给它们有什么价值?在我看来,添加额外的行只会导致可能的问题(例如,有人可能会忘记添加“var”并意外创建全局变量)。那么为什么要这样做呢?

这只是某种编码约定(可能是可读性?),还是 JavaScript 内部工作方式有一些微妙之处,从而以某种方式使这种构造更高效?

4

4 回答 4

8

在这个简单的例子中,我可以说它没有任何区别。但在 javascript 中,函数体中的 var 声明首先被评估。因此,在函数顶部添加所有 var 声明是很有意义的,即使它们只在以后使用。

a = "GLOBAL";

function x(){
    console.log(a);
    var a = "VAR";
    console.log(a);
}

x()

将打印

undefined
VAR

并不是

GLOBAL
VAR
于 2013-06-11T20:48:45.990 回答
2

在一行上声明 'var' 然后再分配给它们有什么价值?

空无一人。无论哪种方式都没有区别。就那么简单。

于 2013-06-11T20:47:15.363 回答
1

我认为这只是一种风格。我也偏爱您的第二个示例,并且经常在同一语句中声明和分配多个变量。我想不出任何理由不这样做,并且会争辩说,随着代码的增长,将这两个语句分开可能只会在以后引起混淆。

于 2013-06-11T20:48:42.927 回答
1

假设您有一个变量需要保留在范围内(或者您处于严格模式),因此您必须使用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已声明。

于 2013-06-11T20:54:37.537 回答