我遇到了关闭的问题,并想确认怀疑。我试图给函数访问最初定义之外的范围。例如,以下代码块可以正常工作。
(function(){
function Outer () {
var test = "closure access";
return function Inner () {
alert(test);
};
};
// call outer then inner
Outer()();
}());
运行时,会提示字符串“closure access”。
但是,如果内部函数在“外部”范围之外定义,然后从“外部”函数返回,则它不再能够访问本地“test”变量。例如:
(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()();
}());
如果新函数在内存中的那一点定义一个函数,它是否应该无法访问测试变量?
答案 0 :(得分:0)
我的问题是,有没有办法在某处(别处)定义一个函数,但是在保留其闭包函数变量的同时从另一个函数动态返回它?
没有。您需要在那里定义一个函数来访问该范围内的变量。
然而,您可以动态地使用其中的其他函数,以便您可以某种方式模拟此行为;尽管如此,你总是需要创建一个新功能。
以下代码段是否未定义函数?
return new Function("alert(test);");
没有。 Function
constructor创建一个没有范围链的函数,就好像它是在全局范围内声明的那样。您需要使用eval
。
答案 1 :(得分:0)
如果所有函数都在同一个对象下定义,那么你可以使用这个
(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)来传递引用,这样你就可以访问其他对象属性。