【发布时间】:2014-08-29 17:12:45
【问题描述】:
我遇到了关闭问题,并想确认一个怀疑。我试图让函数访问它最初定义的范围之外的范围。例如,以下代码块按我的预期工作。
(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()();
}());
这种行为对我来说是有意义的,因为“外部”函数实际上超出了正常范围以查找在其上方定义的“内部”函数,而内部函数未定义在“外部”的范围内本地变量“测试”。我的问题是,有没有办法在某处(其他地方)定义一个函数,但从另一个函数动态返回它,同时仍保留其闭包函数的变量?
如果我必须更好地解释,请告诉我。
==== 编辑 ====
好的,所以定义函数会创建作用域而不是使用函数。下面的代码sn-p是不是没有定义函数?
(function(){
function Outer () {
var test = "closure access";
return new Function("alert(test);");
};
// call outer then inner
Outer()();
}());
如果新函数在内存中的那个点定义一个函数,它应该没有访问测试变量的权限吗?
【问题讨论】:
-
不,函数范围是通过定义函数而不是通过使用函数来创建的。
-
这本质上会给我们私有属性和方法。唉,我们必须下决心把所有东西都放在构造函数中。
标签: javascript closures