我应该在使用它们之前在Javascript中真正声明所有变量吗?

Should I really declare all vars in Javascript before using them?

在这里学习JS,我在这段代码上运行JSLint:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*jslint devel: true*/

function Animal(n) {
   "use strict";
    this.name = n;
    this.prop ="a";
}

var a = new Animal("duppa");

for (v in a) {
    if (a.hasOwnProperty(v)) {
        console.log("property:" + v);
    }
}

我明白了:

1
2
3
4
jslint:test2.js:11:6:'v' was used before it was defined.
jslint:test2.js:11:8:Cannot read property"kind" from undefined

jslint: ignored 0 errors.

它显然抱怨我没有预先声明v

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*jslint devel: true*/

function Animal(n) {
   "use strict";
    this.name = n;
    this.prop ="a";
}

var a = new Animal("duppa");

var v;
for (v in a) {
    if (a.hasOwnProperty(v)) {
        console.log("property:" + v);
    }
}

这会关闭JSLint,但它真的有必要吗? 一般来说,我尝试遵循良好的约定,但这在JS中真的是必要的吗? 例如。 没有这些东西(for x in range(10)...等),Python幸福地生活。


世界上有10种人。那些理解为什么你在javascript中声明变量和那些有规律性行为的人。 (只是笑一下)

您必须了解每个函数都有自己的范围,您必须使用此范围。如果你不在你的函数中使用声明你改变了全局状态,它当然影响很多事情。

所以使用var并且不要创建全局变量!


是的,你绝对应该声明变量。否则你在全局范围内声明v永远不会好,但是对于计算长度像v的单个字母的变量来说尤其如此。

考虑两个人在声明一个同名变量时懒得的情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Your code, which iterates over a nested array

var arr = [ [1, 2], [3, 4] ];

for (i = 0; i < arr.length; ++i) {
  AwesomeLibrary.doSomething(arr[i]);
}

// way down elsewhere, in awesome_library.js...

function doSomething(arr) {
  for (i = 0; i < arr.length; ++i) {
    // Now your `i` is clobbered, and we have a subtle but devastating bug
  }
}

这甚至不需要两个懒人:如果你使用JavaScript足够长并且拒绝声明你的变量,你最终会自己做这件事。


据我所知,如果你使用一个变量而不在函数范围内声明它,它就会在全局范围内声明,这不是最佳实践。您很快就会使用变量来覆盖全局范围。

1
2
3
4
5
6
7
8
9
//This creates a global variable
function not_a_best_practice(){
    a=10;
}

//This creates a local variable
function not_bad(){
    var a=20;
}

这个答案可能会更多地说明手头的讨论:
JavaScript中的变量范围是什么?


请记住,JSLint不会因为一些模糊的学术原因而抱怨,但是因为它可以保护您免受应用程序可能遭受的重大问题的影响。

您声明一个变量以包含当前范围中的变量。它是您和您的程序的保障,同时使代码更具可读性(全局变量无处不在,总是令人困惑)。

想象一下,如果你的应用程序中有一个全局变量v,然后在函数中使用相同的命名法(v)进行迭代。 Javascript将自动假设正在使用全局变量,并且您将在全局中发现自己有不需要的值。话虽如此,你在全局命名空间中放置的东西越少越好。


在使用变量之前定义变量总是更好的做法。这里javascript的for循环要求你定义i,因为它在for循环中,使用

1
2
var v;
for( v in a)