1

因为我习惯了 C 和 Java,所以我发现 Javascript 缺少块作用域有点令人讨厌。有时我发现自己想要声明然后立即执行一个内联函数来解决这个问题。例如:

... 

if (x == 0) { 
  (function () {
    var i;

    for (i = 0; i < 10; i++) {
      ...
    }
  })();
}

...

否则,我觉得有必要在作用域的顶部声明一个函数的所有变量,以避免忘记缺少块作用域。但是在函数的开头有一个巨大的 var 语句对我来说看起来很笨拙。

我在上面展示的方式感觉很浪费,但我不知道首先声明内联函数的成本是多少。这样做是一个坏主意吗?有没有更好的方法来解决我对 Javascript 范围的疑虑?

4

2 回答 2

3

如下写有什么问题:

if (x === 0) { // you should always use === over == in JavaScript
    for (var i = 0; i < 10; i++) {
        // body
    }
}

仅仅因为 JavaScript 不支持块作用域并不意味着您不能在块作用域中声明变量。

您可以在任何地方声明变量。但是,它们在函数范围内随处可见。

JavaScript 中缺少块作用域导致的唯一问题是当您在访问自由变量的循环内定义一个函数时(臭名昭著的循环问题)。

阅读以下 StackOverflow 线程以了解它:循环内的 JavaScript 闭包 - 简单实用的示例

JavaScript 很简单。比 C 或 Java 更简单。它也比 Java 更明智。Java 是一种可悲的语言。

如果您希望 JavaScript 社区成为对您不利的匕首,那么您做得很好。否则就拥抱 JavaScript。用道格拉斯·克罗克福德的话来说:

在我自己的实践中,我发现使用 JavaScript 使我成为了一个更好的 Java 程序员,因为它向我介绍了一组有用的动态技术。

资料来源:JavaScript 编程语言调查

于 2013-03-10T14:17:29.717 回答
3

JavaScript 作用域,缺少 ES5 特性,是在函数级别。这就像 C 过去要求您先声明变量一样;你只需要忍受它。

您的代码在语法上不正确。你有一个以function关键字开头的语句,但没有函数名;紧随其后的是(). 我假设您在谈论函数声明语句。如果您只是将函数实例化为表达式的一部分,那么范围并没有真正考虑到这一点,至少在函数外部。

于 2013-03-10T04:05:52.220 回答