在这里学习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就会幸福地生活。
答案 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?