在Javascript作用域链(Scope Chain in Javascript)

2019-07-19 19:12发布

我已经阅读范围链的Javascript,但它没有任何意义,我可以在任何一个告诉我什么是作用域链以及它如何与一个图形或东西的工作,甚至是白痴也能理解。 我GOOGLE了它,但我没有找到的东西理解:(

提前致谢。

Answer 1:

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

当你巢功能,内部函数即使它们的父功能已经执行之后指存在于它们的外围功能变量A封闭件形成。

的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
    }());
  }());
}());

推荐阅读:

  • JavaScript的闭包
  • 关闭


Answer 2:

在ECMAScript中任何函数调用(即JS是基于核心语言)产生一个单独的执行上下文,其中彼此独立地运行。 内的每个执行上下文的, this指的是在对象问题,默认为任何的功能被附加到。

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

将提醒真实的,因为窗口是该公司拥有的“富”方法的对象。 在函数中定义的任何变量,成为通过该功能独特的作用域链,环境访问。

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标识符没有在相同的上下文中定义,因此它具有范围链向上行进到名称被定义外的功能,和它提醒全球。

参考:

  • http://www.digital-web.com/articles/scope_in_javascript/
  • http://www.jibbering.com/faq/faq_notes/closures.html


Answer 3:

这是关于关闭。 您可以在内部范围内使用变量外,从适用范围:

function get_inner_scope () {
    var outer = 'Outer variable value';
    return function () {
        alert(outer);
    }
}
f = get_inner_scope();
f(); // alerts Outer variable value

与第一谷歌的链接其它样本更多deatailed信息: http://blogs.msdn.com/jscript/archive/2007/07/26/scope-chain-of-jscript-functions.aspx



Answer 4:

我知道这是一个老的文章,但它仍然是开发者有帮助。 我想这样做有点不同的方式,因为它会更友好的初学者了解范围链接。 这里是我的代码修改后的版本:

var currentScope = 0; // global scope
function a () {
   var currentScope = 1, one = 'scope1';
   alert(currentScope);

  function b () {
      var currentScope = 2, two = 'scope2';
      alert(currentScope);

      function c () {
         var currentScope = 3, three = 'scope3';
         alert(currentScope);
  alert(one + two + three); // climb up the scope chain to get one and two
     }
     c();
  }
  b();
}
a();


Answer 5:

在Javascript作用域链中通俗地说解释

亚历克斯是一个快乐的家伙,一个阳光明媚的一天,走与他的手月薪在路上被抢劫。

后来他意识到,明天是最后一天来支付他的女儿$ 1000的学费。
他跑回家,发现他的$ 400的积蓄,大约休息($ 600)。立即想到闪烁,是借用一些从他的父亲马修担忧。
马修,穷木匠,来自任何金钱没有出售他继承手链$ 300,并借给他的儿子亚历克斯。
其亚历克斯在社会上的良好口碑,得到立即从当地银行剩余的300 $,并按时足额他的女儿的学费。

回来在Javascript作用域链:
亚历克斯-A在javascript函数
马修 - 即时功能,亚历克斯嵌套英寸
马修斯的父母,立即功能马修嵌套英寸
银行-全局变量。

function Bank() {
    loan=300;
    Mathew();

    function Mathew() {
        mathew=300;
        Alex();

        function Alex() {
            savings:400;
            alert('I need some money');
        }

    }

}

Bank();

在这一点上亚历的范围链看起来像:[节约:400] + [马修:300] + [贷款:300];



Answer 6:

摘要:

范围链是用来解决在JavaScript变量名的值。 如果没有一个作用域链JavaScript引擎就不知道该挑选某个变量名,其值,如果有多个在不同的范围定义。 在JavaScript作用域链词法定义 ,这意味着我们可以看到作用域链会通过查看代码的东西。

在范围链的顶部是全球范围内,这是window中的浏览器对象( globalNodeJS )。 除了从全球范围内,功能有自己的变量的作用域。 作用域链可以通过查看其中功能定义来确定。

当解析一个变量,内部函数首先要看自己的范围。 如果变量不能在自己的范围内可以找到它会爬上作用域链 ,并寻找其中被定义的函数是在环境变量名。 这看起来是这样的:

因此,在我们的图像例如当innerFoo使用变量bar它首先尝试的innerFoo(代码函数体内)范围内找到它。 然后,当它没有在这里找到它爬上范围链 foo 。 在foo也没有变量,它被命名为bar 。 因此,它会爬上作用域链,现在看起来在全球范围内。 在全球范围内是一个名为酒吧变量,值10到bar将会得到解决。

例:

 let foo = 1; let bar = 1; function test (bar) { return function innerTestFunc () { let foo = 10; console.log(foo, bar); } } const innerTestFunc1 = test(5); const innerTestFunc2 = test(20); innerTestFunc1(); // logs 10, 5 innerTestFunc2(); // logs 10, 20 

在上面的例子,我们有一个返回函数的函数。 我们首先存储在变量此功能innerTestFunc1innerTestFunc2 。 这就产生了一个封闭件 ,其基本上是外环境的范围链的快照。

当功能被执行的功能则需要两个变量的值foobar 。 foo的值可以在水平来解决innerTestFunc和10是两个。 10在已经找到innerFoo ,因此无需爬上作用域链foo的。

在的情况下, bar变量的函数不能在找到它innerFoo 。 因此,它会爬上作用域链。 它首先遇到可变bar在功能test ,因此将解决的值bar到任何的值是在测试功能(5,20在我们的例子)。



文章来源: Scope Chain in Javascript