因为我已经习惯了C和Java,所以我发现Javascript缺少块范围有点令人讨厌。有时我发现自己想要声明然后立即执行内联函数来克服这个问题。例如:
...
if (x == 0) {
(function () {
var i;
for (i = 0; i < 10; i++) {
...
}
})();
}
...
否则,我觉得需要在范围顶部声明函数的所有变量,以避免忘记块范围的缺失。但是在函数开头有一个巨大的var语句对我来说很笨拙。
我上面展示的方式感觉很浪费,但我不知道首先声明内联函数的成本是多少。这样做是不是一个坏主意?有没有更好的方法来解决我的问题与Javascript的范围?
答案 0 :(得分:3)
缺少ES5功能的JavaScript范围是功能级别。这就像C曾经要求你在其他任何事情之前声明变量;你只需忍受它。
您的代码在语法上不正确。你有一个以function
关键字开头但没有函数名的语句;它后跟()
。我假设你在谈论一个函数声明语句。如果你只是将一个函数实例化为一个表达式的一部分,那么范围并没有真正意义,至少在函数外部。
答案 1 :(得分:3)
写下来有什么问题:
if (x === 0) { // you should always use === over == in JavaScript
for (var i = 0; i < 10; i++) {
// body
}
}
仅仅因为JavaScript不支持块作用域并不意味着你不能在块作用域中声明变量。
您可以在任何地方声明变量。然而,它们在函数范围内的任何位置都可见。
JavaScript中缺少块作用域导致的唯一问题是在循环中定义一个访问自由变量的函数(臭名昭着的循环问题)。
阅读以下StackOverflow线程以包围它:JavaScript closure inside loops – simple practical example
JavaScript很简单。 比C或Java更简单。它比Java更明智。 Java是一种可悲的语言。
如果您希望JavaScript社区对您不利,那么您的工作就很棒。否则只是embrace JavaScript。用Douglas Crockford的话来说:
在我自己的实践中,我发现使用JavaScript使我成为一名更好的Java程序员,因为它向我介绍了一组有用的动态技术。