JavaScript函数范围和执行上下文

时间:2019-01-13 22:57:00

标签: javascript scope

我有一些函数和变量:

function b() {
  myvar = 1;
  console.log(myvar);
  a();
}

myvar = 5;
a();
b();
a();

function a() {
  console.log(myvar);
}

控制台日志输出为:5, 1, 1, 1。为什么最后一个a()调用将“ 1”作为输出而不是“ 5”?因为我以为a()是从全局上下文中调用的,并且此全局上下文具有myvar = 5作为其外部变量(向上一级)?

1 个答案:

答案 0 :(得分:2)

此代码中没有 local 变量-每个变量名引用都是对全局变量的引用,因此,每当发生重新分配时,都会重新分配该全局变量。

如果b重新分配了名为myvar local 变量,那么您是正确的,例如,如果myvar中的b是一个参数,或在var/let/const内用b声明:

function b() {
  // next line has "var",
  // indicating that whenever the following variable name is used inside this function
  // it'll be referring to a local variable, not the global `myvar`:
  var myvar = 1;
  console.log(myvar);
  a();
}

myvar = 5;
a();
b();
a();

function a() {
  console.log(myvar);
}