【问题标题】:JavaScript Global and Local ScopeJavaScript 全局和局部范围
【发布时间】:2016-11-23 12:08:05
【问题描述】:

我有一个关于 JavaScript 范围的问题。

如果我有这个代码:

var v = 10;
function fun() {
  v = 20;
  if (v > 10) {
    var v = 0;
  }
}
fun();

为什么 v 还是 10,执行完 fun(); ? 我的意思是不是v = 20; 全球?那么它不会将 v 的值从 10 = 20 改变吗? 我有点困惑,我已经尝试阅读有关 JavaScript 范围的信息,但没有帮助我理解为什么它仍然是 10...

如果有人能给我一个解释,我将非常感激...... :)

【问题讨论】:

  • 看到 this answer 到一个非常相似的问题 - 不要让任何人告诉你这不是因为 javascript 变量提升
  • 而不是发布答案 this fiddle 显示 javascript 如何“解释”(不是最好的词)代码
  • @JaromandaX 没有将其标记为重复的任何具体原因?
  • @Rajesh - 想看看 OP 是否首先了解相似性
  • @JaromandaX 所以它将 var v 的初始化从 if() 提升到函数的开头,以便 v=20 影响 var v 而不是全局变量 v?

标签: javascript scope


【解决方案1】:

这是因为 var v = 0;通过这样做,您在名为 v 的函数中创建了一个局部变量,因此当您说 v=20 时,您指的是局部 v 而不是全局 v。

为了证明这一点,我创建了这个 sn-p 以表明它是创建此行为的 var。 sn -p 中的日志功能就在那里,因此您可以在 DOM 中查看输出。

var v = 10;
function fun() {
  v = 20;
  if (v > 10) {
    var v = 0;
  }
}
function bar() {
  v = 20;
  if (v > 10) {
    v = 0;
  }
}

log("Before fun:",v);
fun();
log("After fun:",v);
bar();
log("After bar:",v);

function log (){
  document.getElementById("log").innerHTML += Array.prototype.slice.call(arguments).join(' ') + '<br>';
}
&lt;div id="log"&gt;&lt;/div&gt;

我发现可视化此过程的最佳方法如下。

var v = 10;
function fun() {
  v = 20;
  if (v > 10) {
    var v = 0;
  }
}
fun();

我在脑海中把这个转换成下面这个就是吊装的过程。

var v = 10;
function fun() {
  var v;
  v = 20;
  if (v > 10) {
    v = 0;
  }
}
fun();

有了这个新代码,很明显 v = 20 指的是局部 v 而不是全局 v。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-09
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多