以下是一些示例代码。我想知道为什么我不应该这样做。
//some code
var x = "hello";
{
var y = "nice";
function myfunction() {
//do stuff . . .
}
}
我看到这样做的好处是能够以块的形式组织代码段,并让自动格式化程序做一些工作......
在我的测试中{}在创建var或函数时不影响范围。
答案 0 :(得分:9)
这个答案是在早期JavaScript实现的时候写的。虽然适用var
的相同规则,ECMAScript 2015 (aka ES6)会引入let
variable declaration statement, which follows "traditional" block-scoped rules。
let
使用块进行范围设定的示例,该块记录“1”,“2”,“1”:
{ let x = 1; console.log(x); { let x = 2; console.log(x) }; console.log(x) }
MDN Reference on Block总结了块的用法:
重要提示:不的JavaScript具有块范围。使用块引入的变量的范围限定为包含函数或脚本,并且设置它们的效果将持续超出块本身。换句话说,块语句不引入范围。 尽管“独立”块是有效的语法,但您不希望在JavaScript中使用独立块,因为如果您认为它们在C或Java中执行类似此类块的操作,则它们不会按照您的想法执行操作。 / em>的
正如在MDN上讨论的那样,语法完全有效,因为{ StatementList }
(又名Block
)是有效的Statement
作品。
然而; 因为这非常重要:a new block does not introduce a new scope。 仅函数体引入新范围。在这种情况下, x
和y
变量具有相同的范围。
另外一个FunctionDeclaration
should appear only as a top-level statement - 也就是说,它必须是一个直接在程序或函数体下的语句,而不是一个块。在这种情况下,myfunction
的声明为"not reliably portable among implementations"。
可以使用IIFE (Immediately Invoked Function Expression)模式,虽然它解决了上述技术问题,但我不建议这样做,因为它会使代码复杂化。相反, I 将简单地创建更多命名函数(命名函数可以嵌套!),可能在不同的模块或对象中,视情况而定。
var x = "hello";
;(function () {
// New function, new scope
// "y" is created in scope, "x" is accessible through the scope chain
var y = "nice";
// Now VALID because FunctionDeclaration is top-level of Function
function myfunction() {
}
})(); // Invoke immediately
// No "y" here - not in scope anymore
答案 1 :(得分:3)
意识到这是旧的,但我想我会更新ES2015。
对于{+ 3}}
中的let + const,我们有更多的意义
public static void displayArray(String[] sentence) {
System.out.print("Your sentence is: ");
for (String word : sentence) {
System.out.printf("%s\t", word);
}
System.out.println();
}
答案 2 :(得分:2)
我不明白最外层花括号背后的原因,但函数总是写在javascript中的花括号内。
如果您正在与其他开发人员合作,他们可能会发现外部花括号更加混乱而不是有用,可能会产生一些负面影响:http://encosia.com/in-javascript-curly-brace-placement-matters-an-example/
答案 3 :(得分:0)
可能有很多理由不以这种方式编写代码......可读性是#1,因为大多数人会发现这会使代码难以阅读。但是,从技术上讲,编码没有任何问题,如果你更容易阅读,那么应该没问题。
答案 4 :(得分:0)
我认为当你开始编写更复杂的程序时,这个约定会有问题。必须有一个很好的理由,除了添加额外的代码行之外,人们不会像其他代码那样进行编码。
但是由于Javascript没有块作用域,代码仍然有效。