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

时间:2014-02-15 14:40:12

标签: javascript

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

/*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);
    }
}

我明白了:

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

/*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就会幸福地生活。

5 个答案:

答案 0 :(得分:1)

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

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

// 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 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

var v;
for( v in a)

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

//This creates a global variable
function not_a_best_practice(){
    a=10;
}

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

这个答案可能会对现有的讨论有所启发: What is the scope of variables in JavaScript?