我无法理解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
未定义”
我很困惑,有人会给我一些解释吗?
提前致谢。
答案 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将使用let
和const
引入块范围,但为了便于讨论,请假设前两个。
这意味着函数中定义的变量只能在该函数中可见。这与执行上下文无关。
因此,在您的示例中,first_var
仅在first
中可见,second_var
仅在second
中可见,global_var
全局可见,因为它不是在函数中定义。
执行上下文与定义this
的方式有关,但这完全是另一个问题和另一个主题。