变量范围和javascript执行上下文

时间:2015-04-12 14:40:51

标签: javascript

我无法理解Javascript执行上下文

见下面的代码:

<script >    

  var global_var;
  first();

  function first() {
    var first_var = 'a';
    second();
  }

  function second() {
    var second_var = 'b';

    console.log(first_var);
    console.log(second_var);
  }

  console.log('in the outer');
  //second();  

</script>

根据我的理解,当first函数调用second函数时,第二个函数在第一个函数的执行上下文中,因此,second也可以访问first函数的属性,这里是first_var

但是,函数second中的实际输出显示“first_var未定义”

我很困惑,有人会给我一些解释吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

范围是基于代码的词法结构,而不是函数之间的动态运行时关系(“执行线程”)。词汇结构是代码的静态组织;函数内部函数的“嵌套”。

在你的情况下,“second”函数在“first”函数之外声明,因此“first”中的局部变量对于“second”中的代码是不可见的。

如果要在“first”中移动“second”函数:

function first() {
  function second() {
    var second_var = 'b';

    console.log(first_var);
    console.log(second_var);
  }
  var first_var = 'a';
  second();
}

然后变量可见。

答案 1 :(得分:0)

JavaScript有两个范围:全局和函数。 (ES6将使用letconst引入块范围,但为了便于讨论,请假设前两个。

这意味着函数中定义的变量只能在该函数中可见。这与执行上下文无关。

因此,在您的示例中,first_var仅在first中可见,second_var仅在second中可见,global_var全局可见,因为它不是在函数中定义。

执行上下文与定义this的方式有关,但这完全是另一个问题和另一个主题。