javascript – 为什么在另一个函数内部调用的函数不能访问外部函数的作用域?

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

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的全局变量,我只能想象bar工作.

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

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

bar = foo();
bar();

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

最佳答案 两种方式都是可能的.

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

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

使用词法范围,您可以通过查看您正在使用的变量的“版本”来判断,但使用动态范围可能取决于谁在调用您,这使您很难使用这些变量执行任何操作.

点赞