- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在为变量赋值之前在 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';
}
};
最佳答案
这主要是风格问题。
As var
声明自动 hoisted up到作用域的顶部,将它们放置在其作用域的顶部是有意义的,这样您可以更接近解释器执行代码的方式阅读代码。
在其作用域顶部声明变量是 Crockford's recommendation 。它确实有道理,因为它消除了一些常见的误解。
例如:
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
}, 0);
}
由于 var
具有函数作用域,因此所有迭代(以及其中的函数)都引用相同的 i
。由于所有三个定时函数都将在循环结束后执行,因此上面的代码片段会记录 3
三次。
现在对于那些具有 block 作用域经验的人来说,上述行为并不是很清楚。重写代码片段:
var i;
for (i = 0; i < 3; i++) {
// ...
}
现在,i
在全局范围内声明,与前面的代码片段完全相同。然而,这个在这一点上更加清楚。
另一个误解:
(function() {
if (true) {
var foo = 1;
} else {
var foo = 1;
}
}());
同样,在 block 作用域语言中,上述内容是完全有效的。但是,由于 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
引入了 block 作用域变量,但尚未得到广泛支持。
关于javascript - 声明空 JavaScript 变量的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16912892/
我已经为使用 JGroups 编写了简单的测试。有两个像这样的简单应用程序 import org.jgroups.*; import org.jgroups.conf.ConfiguratorFact
我有一个通过 ajax 检索的 json 编码数据集。我尝试检索的一些数据点将返回 null 或空。 但是,我不希望将那些 null 或空值显示给最终用户,或传递给其他函数。 我现在正在做的是检查
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Why does one often see “null != variable” instead of “
嗨在我们公司,他们遵循与空值进行比较的严格规则。当我编码 if(variable!=null) 在代码审查中,我收到了对此的评论,将其更改为 if(null!=variable)。上面的代码对性能有影
我正在尝试使用 native Cordova QR 扫描仪插件编译项目,但是我不断收到此错误。据我了解,这是代码编写方式的问题,它向构造函数发送了错误的值,或者根本就没有找到构造函数。那么我该如何解决
我在装有 Java 1.8 的 Windows 10 上使用 Apache Nutch 1.14。我已按照 https://wiki.apache.org/nutch/NutchTutorial 中提
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: what is “=null” and “ IS NULL” Is there any difference bet
Three-EyedRaven 内网渗透初期,我们都希望可以豪无遗漏的尽最大可能打开目标内网攻击面,故,设计该工具的初衷是解决某些工具内网探测速率慢、运行卡死、服务爆破误报率高以及socks流
我想在Scala中像在Java中那样做: public void recv(String from) { recv(from, null); } public void recv(String
我正在尝试从一组图像补丁中创建一个密码本。我已将图像(Caltech 101)分成20 X 20图像块。我想为每个补丁创建一个SIFT描述符。但是对于某些图像补丁,它不返回任何描述符/关键点。我尝试使
我在验证器类中自动连接的两个服务有问题。这些服务工作正常,因为在我的 Controller 中是自动连接的。我有一个 applicationContext.xml 文件和 MyApp-servlet.
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭10 年前。 问题必须表现出对要解决的问题的最低程度的了解。告诉我们您尝试过做什么,为什么不起作用,以
大家好,我正在对数据库进行正常的选择,但是 mysql_num_rowsis 为空,我不知道为什么,我有 7 行选择。 如果您发现问题,请告诉我。 真的谢谢。 代码如下: function get_b
我想以以下格式创建一个字符串:id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&等,在for循环中,我得到
我正在尝试使用以下代码将URL转换为字符串: NSURL *urlOfOpenedFile = _service.myURLRequest.URL; NSString *fileThatWasOpen
我正在尝试将NSNumber传递到正在工作的UInt32中。然后,我试图将UInt32填充到NSData对象中。但是,这在这里变得有些时髦... 当我尝试将NSData对象中的内容写成它返回的字符串(
我正在进行身份验证并收到空 cookie。我想存储这个 cookie,但服务器没有返回给我 cookie。但响应代码是 200 ok。 httpConn.setRequestProperty(
我认为 Button bTutorial1 = (Button) findViewById(R.layout.tutorial1); bTutorial1.setOnClickListener
我的 Controller 中有这样的东西: model.attribute("hiringManagerMap",hiringManagerMap); 我正在访问此 hiringManagerMap
我想知道如何以正确的方式清空列表。在 div 中有一个列表然后清空 div 或列表更好吗? 我知道这是一个蹩脚的问题,但请帮助我理解这个 empty() 函数:) 案例)如果我运行这个脚本会发生什么:
我是一名优秀的程序员,十分优秀!