我已经在 Javascript 中阅读了作用域链,但它对我没有任何意义,谁能告诉我什么是作用域链以及它如何与图形一起工作或什至白痴都能理解的东西。我用谷歌搜索,但我没有找到可以理解的东西:(
Javascript 中的作用域链
要理解作用域链,你必须知道闭包是如何工作的。
当您嵌套函数时会形成一个闭包,即使在其父函数已经执行之后,内部函数也可以引用其外部封闭函数中存在的变量。
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
标识符不是在同一个上下文中定义的,因此它必须沿着作用域链向上移动到定义名称的外部函数,并且它会向全局发出警报。
参考:
我知道这是一个旧帖子,但它仍然对开发人员有帮助。我想用一点不同的方式来做,因为它对初学者理解作用域链会更友好。这是我修改后的代码版本:
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();
这是关于关闭。您可以在内部作用域中使用作用域外部的变量:
function get_inner_scope () {
var outer = 'Outer variable value';
return function () {
alert(outer);
}
}
f = get_inner_scope();
f(); // alerts Outer variable value
通过第一个谷歌链接获得其他示例的更多详细信息:http : //blogs.msdn.com/jscript/archive/2007/07/26/scope-chain-of-jscript-functions.aspx
亚历克斯是个快乐的人,一天晴朗,拿着月薪走在路上被抢劫了。
后来他意识到明天是支付女儿1000美元学费的最后一天。
他跑回家,发现自己有400美元的积蓄,担心剩下的(600美元)。瞬间闪过的念头是向父亲马修借一些。
贫穷的木匠马修一文不名,以 300 美元的价格卖掉了他继承的手镯,并借给了他的儿子亚历克斯。
亚历克斯在社会上享有良好的声誉,立即从当地银行获得了剩余的300美元,并按时支付了女儿的学费。
回到 Javascript 中的作用域链:
Alex-javascript
Mathew 中的一个函数Mathew-立即函数,Alex 嵌套在其中。
Mathews 的父母-立即函数 Mathew 嵌套在
Bank-Global 变量中。
function Bank() {
loan=300;
Mathew();
function Mathew() {
mathew=300;
Alex();
function Alex() {
savings:400;
alert('I need some money');
}
}
}
Bank();
Alex 的作用域链此时看起来像:[savings:400]+[mathew:300]+[loan:300];