Cod*_*ith 3 javascript scope nested-function
因此,通过以下代码,我向自己证明了嵌套函数确实获得了外部函数的参数的副本:
var o = {};
(function(a,b,c,x){
x.f = function(){
return a.toString()+b.toString()+c.toString();
}
})(7,4,2,o);
o.f();
Run Code Online (Sandbox Code Playgroud)
代码产生
742
Run Code Online (Sandbox Code Playgroud)
这意味着该o.f函数从匿名函数中获取a,b和c的副本.否则,我会得到undefinedundefinedundefined
我的问题是,
你观察到的是词法范围.这意味着JavaScript中某个范围内变量的绑定取决于变量在代码中的显示位置.它总是如此,并且在任何级别都是如此.唯一的主要例外是this值,它是动态范围而不是词法范围.动态范围意味着函数中的变量取决于函数的调用方式和时间.(参见词汇范围和动态范围.)
例:
var o = {
a: function() {
var x = 5;
console.log(this, x);
function b() {
console.log(this, x);
}
b();
}
};
o.a();
Run Code Online (Sandbox Code Playgroud)
这个例子的结果将是:
{Object o} 5
{window} 5
Run Code Online (Sandbox Code Playgroud)
换句话说,第一个console.log将记录this为o对象的引用,而第二个console.log将记录this为window对象的引用.但是,两者都会记录x为等于5.值的值this是window在没有上下文的情况下以非严格模式调用它.所以this不是词法上的范围,而是其他变量,例如x.要阅读更多有关行为的信息,this请参阅简短概述this.
直接回答您的问题:
是的,它的除外真实this和arguments基于功能是如何调用它的变化.它不必是一个对象,所有变量都是词法范围的.
你可以尽可能深入 - 内部函数总是可以访问其外部函数的变量.
function a() {
var x = 1;
console.log('a:', x);
return function b() {
var y = 2;
console.log('b:', x, y);
return function c() {
console.log('c:', x, y);
};
};
}
var foo = a(); // => logs 'a: 1'
var bar = foo(); // => logs 'b: 1 2'
bar(); // => logs 'c: 1 2'
Run Code Online (Sandbox Code Playgroud)
这实际上是另一个被称为闭包的主题的一部分,当从另一个函数中返回一个函数时会发生这种情况.
我已经链接了几个资源.另一个好的:
MDN:函数和函数作用域(特别是有关嵌套函数和闭包的部分).
此外,您将从阅读任何关于闭包的内容中受益,您可能还想查找词法范围.
| 归档时间: |
|
| 查看次数: |
9300 次 |
| 最近记录: |