Javascript中的范围链

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

提前致谢。

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

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

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

考虑这个例子有三个嵌套函数:

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

推荐阅读:

  • JavaScriptclosures
  • closures

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

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

会提醒真实的,因为窗口是拥有'foo'方法的对象。 在函数中定义的任何variables都可以通过该函数的唯一作用域链接来访问。

 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标识符没有在相同的上下文中定义,因此它必须沿着作用域链上行到定义名称的外部函数,并且它警告全局。

参考:

这是closures。 您可以在范围内使用范围外的variables:

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

首先google的链接更多deatailed信息与其他样本: http : //blogs.msdn.com/jscript/archive/2007/07/26/scope-chain-of-jscript-functions.aspx

我知道这是一个旧的职位,但它仍然有助于开发人员。 我想以一种不同的方式来做,因为初学者会更友好地理解范围链。 这里是我的修改版本的代码:

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

Javascript中的范围链以非专业术语解释

亚历克斯是一个快乐的人,一个美好的一天,他手中的月薪走在路上被抢劫。

后来他意识到,明天是支付1000美元女儿学费的最后一天。
他跑回家,发现他的储蓄是400美元,其余的(600美元)担心,闪现的直接想法是从他父亲马修那里借来一些钱。
这个可怜的木匠Mathew,没有任何钱可以把他遗传的手镯卖给300美元,并借给他的儿子Alex。
亚历克斯在社会上有良好的声誉,立即从当地银行取得剩余的300美元,并按时支付女儿学费。

在Javascript中回到Scope链:
亚历克斯 – JavaScript中的一个函数
马修 – 即时function,亚历克斯嵌套在。
Mathews父母 – Mathew嵌套的直接函数。
银行全局variables。

 function Bank() { loan=300; Mathew(); function Mathew() { mathew=300; Alex(); function Alex() { savings:400; alert('I need some money'); } } } Bank(); 

亚历克斯在这一点的范围链如下:[节约:400] + [mathew:300] + [loan:300];

Interesting Posts