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. |
它显然抱怨我没有预先声明
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中真的是必要的吗? 例如。 没有这些东西(
世界上有10种人。那些理解为什么你在javascript中声明变量和那些有规律性行为的人。 (只是笑一下)
您必须了解每个函数都有自己的范围,您必须使用此范围。如果你不在你的函数中使用声明你改变了全局状态,它当然影响很多事情。
所以使用var并且不要创建全局变量!
是的,你绝对应该声明变量。否则你在全局范围内声明
考虑两个人在声明一个同名变量时懒得的情况:
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,然后在函数中使用相同的命名法(
在使用变量之前定义变量总是更好的做法。这里javascript的for循环要求你定义i,因为它在for循环中,使用
1 2 | var v; for( v in a) |