声明空javascript变量的最佳实践
Best practice for declaring empty javascript variables
在给变量赋值之前,在javascript中声明变量是否有最佳实践?有时由于范围的原因是必要的,但如果范围无关紧要呢?
// Declare first
(function() {
var foo = 'bar',
a = 500,
b = 300,
c;
// Some things get done here with a and b before c can use them...
c = a * b;
// c is now ready to use...
doSomething(c);
}());
// Declare when needed
(function() {
var foo = 'bar',
a = 500,
b = 300;
// Some things get done here with a and b before c can use them...
var c = a * b;
// c is now ready to use...
doSomething(c);
}());
我也想知道对于类似于对象字面量的东西,什么是最佳实践:
// Add property with null assigned to it
var myObj = {
foo: null,
doSomething: function() {
this.foo = 'bar';
}
};
// Property gets added when value is set
var myObj = {
doSomething: function() {
this.foo = 'bar';
}
};
这主要是风格问题。
由于var
声明被自动提升到作用域的顶部,因此将它们放在作用域的顶部是有意义的,这样您可以更接近解释器将如何执行它来阅读代码。
在变量作用域的顶部声明变量是Crockford的建议。它确实有意义,因为它澄清了一些常见的误解。
例如:for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
}, 0);
}
由于var
具有函数作用域,所有迭代(以及其中的函数)都指向同一个i
。由于所有三个定时函数都将在循环结束后执行,因此上面的代码片段记录3
三次。
对于那些有块作用域经验的人来说,上面的行为不是很清楚。重写代码片段:
var i;
for (i = 0; i < 3; i++) {
// ...
}
现在,在全局作用域中声明i
,与前面的代码片段完全相同。然而,这一条在这一点上要清楚得多。
另一个误解:
(function() {
if (true) {
var foo = 1;
} else {
var foo = 1;
}
}());
同样,在块作用域语言¹中,以上是完全有效的。但是,由于var
声明在解析时被提升到当前函数作用域的顶部,因此上面的内容相当于:
(function() {
var foo;
var foo;
if (true) {
foo = 1;
} else {
foo = 1;
}
}());
变量声明两次。大多数浏览器会忽略第二个声明,代码会"正常工作",但是静态代码分析工具,如JSHint会对你大喊大叫。
你可以用一个声明重写它,它是完全有效的:
(function() {
if (true) {
var foo = 1;
} else {
foo = 1;
}
}());
但是像我这样有强迫症的程序员会觉得它很丑。同样,在作用域的顶部声明:
(function() {
var foo;
if (true) {
foo = 1;
} else {
foo = 1;
}
}());
看起来整洁多了。
再次强调,这主要是风格问题。就我个人而言,如果我有一个巨大的函数,我讨厌一直向上滚动,只是为了检查变量是否已经声明并将其添加到列表中。在这种情况下,我可能只是在函数中间添加几个var
声明(反对Crockford的建议),我个人认为这更容易阅读和维护。
因为这是一个风格问题,所以请确保您的代码尽可能保持最易维护和简洁。
在硬币的另一边,我个人承认,当变量第一次使用时,我已经开始并且主要使用var
声明。这是语言的一个方面,你可以毫无问题地这样使用它。
但是我也承认,如果我从一开始就遵循Crockford的建议,我就不会那么头疼了(就像上面所示的误解一样),也会更快地掌握JavaScript的函数作用域方面。
¹注意JS 1.7通过let
引入了块作用域变量,但它还没有被广泛支持。
- 在javascript函数的循环中设置全局布尔变量的最佳语法
- 在控制器之间传递变量的最佳方式
- 在变量中保存值的最佳方法是在应用程序关闭后使用,然后使用apachecordova在android中重新启动
- 在jquery中设置多个全局变量的最佳方式
- 返回多个变量的 JavaScript 函数:数组与对象.最佳实践是什么
- 保存全局变量以供指令监视的最佳方法
- 将变量传递给AngularJS控制器,最佳实践
- 将全局配置变量传递到手把模板的最佳方式是什么
- 测试变量是否为数组的最佳方法
- 避免节点中全局变量的最佳实践
- 在没有ajax的情况下将多个变量传递到引用页面的最佳方式
- 创建静态(类)变量-最佳实践
- 传递变量:使用模块的最佳实践
- 在本地将单个变量传递给具有多个参数的函数的最佳方法是什么
- 条件变量赋值的最佳方法
- 这是检查变量是否被定义的最佳方法,而不是 null 并等于 “” 或其他任何内容
- 在 Javascript 中访问控制器变量的最佳方法是什么?
- 关联变量及其 ID 的最佳方式
- 缓存变量时,调用它的最佳方法是什么
- 创建用户可以在带有 php 或 JavaScript 的模板中使用的“变量”的最佳方式