【问题标题】:Why can't a function called inside another one get access to outer function's scope?为什么在另一个函数内部调用的函数不能访问外部函数的范围?
【发布时间】:2017-01-04 08:48:14
【问题描述】:

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

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 function scope


【解决方案1】:

您所说的称为“动态范围”,在 JavaScript 中是不可能的。 JavaScript 的方式和现在几乎所有的东西都被称为“词法作用域”。你可以用谷歌搜索这两个主题,以获得关于该主题的大量讨论。

过去曾有一些语言尝试过动态作用域。但实际上,很久以前就已经确定动态作用域只会使推理程序和弄清楚发生了什么变得太困难了。

使用词法范围,您可以通过查看您正在使用的变量的哪个“版本”来判断,但使用动态范围可能取决于谁在给您打电话,这让您很难使用这些来做任何事情变量。

【讨论】:

    猜你喜欢
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2019-09-11
    • 2014-11-07
    相关资源
    最近更新 更多