为什么在另一个内部调用的函数可以访问外部函数的范围?

时间:2016-08-28 01:45:07

标签: javascript function scope

为什么函数在定义范围内,使这样的代码不起作用?

function foo() {
    var text = "abc";
    bar(); // ReferenceError because bar cannot access foo's local variables
}

function bar() {
    console.log(text); // Calling bar inside foo does not grant it access to foo's local variables 
}

foo();

如果我们定义一个名为 text 的全局变量,我只能想象吧。

我理解我们可以访问函数的局部变量的唯一方法是创建一个像这样的闭包

function foo() {
    var text = "abc";
    return function() {
        console.log(text);
    }
}

bar = foo();
bar();

好吧,我喜欢认为我理解JavaScript范围(包括ES6&#ccs块范围)。 所以我想我的问题是,为什么一个在另一个内部调用的函数可以访问外部函数的范围,好像它是在它内部定义的一样?那会有什么不利之处?

1 个答案:

答案 0 :(得分:2)

两种方式都是可能的。

您所谈论的内容称为“动态范围”。现在,JavaScript和几乎所有内容的方式称为“Lexical Scoping”。您可以谷歌这两个以获得关于该主题的大量讨论。

过去曾有语言试过动态范围。但实际上,很久以前就已经确定,动态范围化使得很难对程序进行推理并弄清楚发生了什么。

使用词法范围,您可以通过查看您正在使用的变量的“版本”来判断,但是使用动态范围可能取决于谁在呼唤您,这使您很难使用这些变量做任何事情变量