【问题标题】:Java vs. JavaScript variable scope [closed]Java 与 JavaScript 变量范围
【发布时间】:2012-09-28 18:00:09
【问题描述】:

在下面的 Java sn-p 中,i 的范围仅限于 for 循环内部。这就是为什么它会导致错误。然而,在类似的 JS sn-p 中,i 显然可以在循环之外访问。这怎么可能?

Java:

for(int i=0;i<10;i++) {
    ...
}
System.out.println(i);

输出:“我没有定义”

JS:

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

输出:10

我没想到会看到 JS 的输出。我想知道 JS 与 Java 有何不同。 JavaScript 变量作用域是如何工作的?

【问题讨论】:

  • 你是不是意思for的末尾加上分号?
  • 我认为他做到了,否则第一个循环的结果将是十次打印,而不是“我未定义”。
  • @LouisWasserman 是的,他打算把分号留在那里。您必须检查的事实是为什么这样做从来没有是好的做法。
  • @LouisWasserman 我已经编辑了这个问题,以避免这种混淆。

标签: java javascript scope


【解决方案1】:

在 Javascript 中,“局部”变量具有 函数作用域,而不是 块作用域

所有局部变量声明都“提升”到当前作用域的顶部,所以你的代码相当于:

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

请注意,当 声明 被提升时,任何 assignment 都不会。例如这段代码

function test() {
    console.log(i);  // undefined
    var i = 1;       // declaration and assignment
    console.log(i);  // 1
}

相当于:

function test() {
    var i;           // declaration hoisted
    console.log(i);  // undefined
    i = 1;           // assignment still happens here
    console.log(i);  // 1
}

【讨论】:

  • 我想补充一点,因为所有变量声明都将被提升到它们出现的函数的顶部,许多人(包括我自己)认为最好的做法是在代码中反映这一点在函数开始时声明所有变量,即使它们只在一个块中使用。这样可以防止混淆,也可以更容易地整理出闭包。
  • @Kiyura 实际上,我不坚持这种观点,我更喜欢声明(并分配给)更接近其使用点的变量。
【解决方案2】:

Javascript 只有两种类型的作用域——全局和函数。 Javascript 在函数级别是 lexically scoped

【讨论】:

    猜你喜欢
    • 2020-02-07
    • 2012-12-23
    • 2011-05-10
    • 2011-07-07
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多