JavaScript全局和本地范围

时间:2016-11-23 12:08:05

标签: javascript scope

我对JavaScript中的作用域有疑问。

如果我有这段代码:

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

为什么在执行fun()之后v仍然是10; ? 我是说全球不是v = 20;?那么它不会从10 = 20改变v的值吗? 我有点困惑,我已经尝试过阅读JavaScript范围,但没有帮助我理解为什么它仍然是10 ...

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

1 个答案:

答案 0 :(得分:0)

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

为了证明这一点,我创建了这个片段,以显示它是创建此行为的var。代码段中的日志功能就在那里,因此您可以在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>';
}
&#13;
<div id="log"></div>
&#13;
&#13;
&#13;

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

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。