JavaScript动态关闭范围
我遇到了一个关闭问题,并想确认一个怀疑。 我试图给一个函数访问它最初定义的范围之外的范围。 例如下面的代码块就像我期望的那样工作。
(function(){
function Outer () {
var test = "closure access";
return function Inner () {
alert(test);
};
};
// call outer then inner
Outer()();
}());
当运行字符串“闭包访问”时会收到警报。
但是,如果内部函数定义在“外部”范围之外,然后从“外部”函数返回,则不再有权访问本地“测试”变量。 例如:
(function(){
function Inner () {
alert(test);
};
function Outer () {
var test = "closure access";
return Inner;
};
// call outer then inner
Outer()();
}());
这种行为对我来说很有意义,因为“外部”函数实际上超越了它的正常范围来查找上面定义的“内部”函数,并且内部函数没有在“外部”局部变量“测试”。 我的问题是,有没有办法在某处(别处)定义一个函数,但从另一个函数动态返回它,同时仍然保留其闭包函数的变量?
请让我知道,如果我必须更好地解释。
====编辑====
好的,所以定义该函数将创建该范围并且不使用该函数。 下面的代码段没有定义函数吗?
(function(){
function Outer () {
var test = "closure access";
return new Function("alert(test);");
};
// call outer then inner
Outer()();
}());
如果新函数在内存中的那个点上定义了一个函数,它应该无法访问测试变量?
我的问题是,有没有办法在某处(别处)定义一个函数,但从另一个函数动态返回它,同时仍然保留其闭包函数的变量?
不需要。您需要在那里定义一个函数来访问该范围内的变量。
但是,您可以动态地使用其中的其他功能,以便以某种方式模拟此行为; 尽管如此,你总是需要创建一个新的功能。
下面的代码段没有定义函数吗?
return new Function("alert(test);");
不。 Function
构造函数创建一个没有作用域链的函数,就好像它是在全局作用域中声明的一样。 你需要使用eval
。
如果所有的功能都在同一个对象下定义,那么你可以使用它
(function(){
function Inner () {
alert(this.test);
};
function Outer () {
this.test = "closure access";
return Inner;
};
// call outer then inner
Outer()();
}());
但如果函数是在不同的对象下定义的,那么你可以使用prototype.call(this)或prototype.apply(this)来传递引用,这样你就可以访问其他的对象属性。
链接地址: http://www.djcxy.com/p/51613.html