Javascript中的范围链

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

我已经阅读了Javascript中的范围链,但它对我来说没有任何意义,任何人都可以告诉我什么是范围链,以及它是如何与图形或甚至白痴可以理解的。我GOOGLE了,但我没有找到可理解的东西:(

提问于
用户回答回答于

要了解范围链,您必须知道关闭如何工作。

嵌套函数时会形成闭包,即使在父函数已经执行后,内部函数也可以引用其外部封闭函数中存在的变量。

JavaScript通过遍历范围链来解析特定上下文中的标识符,从本地移动到全局。

考虑三个嵌套函数的例子:

var currentScope = 0; // global scope
(function () {
  var currentScope = 1, one = 'scope1';
  alert(currentScope);
  (function () {
    var currentScope = 2, two = 'scope2';
    alert(currentScope);
    (function () {
      var currentScope = 3, three = 'scope3';
      alert(currentScope);
      alert(one + two + three); // climb up the scope chain to get one and two
    }());
  }());
}());

推荐阅读:

用户回答回答于

ECMAScript中的任何函数(JS基于的核心语言)都是独立的执行上下文,并且彼此独立运行。在每个执行上下文中,this引用正在讨论的对象,默认为该函数所附加的任何内容。

function foo() {
    alert(this===window)
}

警报是真实的,因为窗口是拥有'foo'方法的对象。在函数中定义的任何变量都可以通过该函数的唯一范围链环境进行访问。

function world() {
    var name = 'global';
    alert(name)
}

显然会提醒'全球'。

function world() {
    var name = 'global';
    (function() {
        var name = 'country';
        alert(name)
    })();
    alert(name)
}

在最新示例中,当调用第一个警报时,Javascript确定在内部函数的作用域链中name定义了标识符,因此它不必查找作用域链来获取它。

在第二次警报调用中,name也在相同的上下文中定义并警告'全局';

function world() {
    var name = 'global';
    (function() { alert(name) })();
}

在这个例子中,name标识符没有在同一个上下文中定义,因此它必须沿着作用域链上行到定义名称的外部函数,并提醒全局。

参考:

扫码关注云+社区