Javascript 在顶部定义每个变量总是最好的方法吗?
我听说在函数顶部定义变量是一种很好的技术,这样就不会出现变量提升问题。这:Javascript 在顶部定义每个变量总是最好的方法吗?,javascript,variables,Javascript,Variables,我听说在函数顶部定义变量是一种很好的技术,这样就不会出现变量提升问题。这: // Beginning of file function something(){ var a, b, c = 1, d, e; // Do something } // End of file 是一个很好的例子(当然,不包括坏的变量名) 我的问题是:这总是最好的方法吗?如果您处理的变量很多,该怎么办?它们真的应该放在一行上吗?这是一个风格问题。这不是一个功能性问题 javascript解析器将接
// Beginning of file
function something(){
var a, b, c = 1, d, e;
// Do something
}
// End of file
是一个很好的例子(当然,不包括坏的变量名)
我的问题是:这总是最好的方法吗?如果您处理的变量很多,该怎么办?它们真的应该放在一行上吗?这是一个风格问题。这不是一个功能性问题 javascript解析器将接受此代码
function() {
dostuff();
var i = 4;
}
并将其转化为:
function() {
var i;
dostuff();
i = 4;
}
至于风格问题。不,谢谢,我以为我们把它忘在ANSI C上了
您要做的是在函数的“作用域”顶部声明函数
如果变量的“作用域”是整个函数,则在顶部声明它们。如果“范围”是函数的子集,则在子集的开头声明它们
将“范围”视为逻辑范围,而不是功能范围
这将确保最大的可读性。我敢说,在较旧的结构(如C\C++时代)中,初始化变量并为其分配一个起始值是很重要的。但随着事情的发展,我发现在“必要时”声明它们是一个有效的实现。除非作用域起了作用(例如,您不仅在该函数中需要变量
a
,而且在其他函数中也需要变量),否则我会立即声明
也许这只是一种思维方式,但我倾向于根据作用域进行声明(如果变量只在If条件或几行代码中需要,我会在那里声明它(而不是在我的函数/类的顶部)。如果我不通过该代码路径,我会认为它是在保存内存分配,并且不会为“没有理由”。)
但是,我可能完全错了。无论如何,JavaScript都允许您以任何您认为最容易阅读的方式声明变量。这实际上只是一个偏好问题。例如,如果我的方法只包含For循环,那么我不会将循环变量提取到顶部:
var func = function(arr) {
for (var i = 0, len = arr.length; i < len; i++) {
// array processing here
}
}
var func=函数(arr){
对于(变量i=0,len=arr.length;i
几乎所有其他时间,虽然我会把所有的变量放在顶端,因为你的函数顶部有太多的变量,这可能是你的方法做了太多的工作,并且应该考虑把它的一部分提取成某种帮助方法。基于功能的变量。
在具有块作用域的语言中,通常建议在首次使用时声明变量
但是因为JavaScript没有块作用域,所以在函数顶部声明函数的所有变量更明智。这样你就不会在变量的作用域上欺骗自己或其他人
编辑:许多人同时使用多种语言。通常JavaScript是其中唯一没有块作用域的语言。“它们真的应该全部放在一行上吗?”
我不这么认为。
下面是我如何写的(忽略姓名):
这在上面看起来很愚蠢,因为1)名称很糟糕2)变量没有在“声明”中赋值——大多数代码都可以使用不可变(赋值一次)变量编写,我发现这可以简化代码。我使用它有多种原因,包括清晰性和不易更改格式(也就是说,我可以更改初始值、添加/或删除声明等,而不会影响其他行的格式)
“在顶部定义每个变量始终是最好的方法吗?”
我不这么认为。
例如,我是如何编写循环的:
for (var i = 0; i < x; i++) {
var elm = elms[i];
...
}
for(变量i=0;i
有些人会说“但是VAR被提升到了函数的顶部!”或者“变量是函数范围的!”。的确如此。但是,这让我很容易直观地看到这是一个错误,即使JavaScript引擎没有帮助:
for (var i = 0; i < x; i++) {
var elm = elms[i];
...
}
...
// valid JS but since I consider this construct *invalid*
// I know this is a *bug* in my code
alert(elm);
for(变量i=0;i
就我分配给闭包中捕获的变量而言:这取决于。如果该变量仅用于单个闭包,我通常将其放在正上方。这让我知道它只应用于该闭包。如果该变量是共享的(例如self
),我将其放在所有适用闭包的上方——通常在“函数的变量声明部分。这让我知道它有一个“函数范围”(读:可能在多个绑定中使用)
要解决“for each closure issues”--只需学习语言。将变量“声明”放在闭包附近无论如何都不会影响这一点。如果不理解构造,那么代码的编写方式就无关紧要了
我使用这些方法是因为:
具有一致的易于扫描的代码
编写代码,告诉我何时出错
我更喜欢可以修改而不改变结构的代码
自文档化代码意味着更少的注释
我喜欢“垂直阅读”
愉快的编码。我强烈建议进行阅读。他的论点是,您既不应该在一行中声明所有变量,也不应该在例程的顶部声明所有变量。因此,不要这样做:
function foo() {
var a,
b,
c,
d;
/**
* 20 lines that use a and b
*/
/**
* 10 lines that use c and d
*/
}
相反,您应该在需要变量的位置附近声明变量。在上面的代码中,这可能如下所示:
function foo() {
var a,
b;
/**
* 20 lines that use a and b
*/
var c,
d;
/**
* 10 lines that use c and d
*/
}
其好处是,只需查看代码块上方的声明,您就可以快速了解代码块使用了哪些变量
function foo() {
var a,
b;
/**
* 20 lines that use a and b
*/
var c,
d;
/**
* 10 lines that use c and d
*/
}