我遇到了将一个值从一个函数返回到另一个函数的需要,并且在这个简单的任务不起作用的时候,有一段时间让我感到困惑。然后我意识到我在一个闭包函数(或匿名函数?)中运行,并且无法找到有关如何从这样一个函数的范围中释放变量的文档。
例如,这不起作用:
function aFunc()
{
var result;
object.event = function(){
result = true;
}
return result;
}
也不会从封闭内部返回。我需要两个都做吗?我尝试在尽可能最大的范围内使用全局变量(在所有函数之外),但这也不起作用。我错过了什么?
我不确定我是否正确使用了术语闭包,我指的是匿名函数。
感谢。
答案 0 :(得分:4)
你需要调用闭包:
function aFunc() {
var result;
object.event = function() {
result = true;
};
object.event();
return result;
}
或者,如果它在其他地方运行,这是一个时间问题。您可以使用 promise :
function aFunc() {
var promise = { hasRun: false, result: null };
object.event = function() {
result.hasRun = true;
result.result = true; // or something else...
};
return promise;
}
// check if it has run and get the result:
if (promise.hasRun) {
// access promise.result
}
但是,一个简单的回调就足够了。由于您提到了XMLHttpRequest
对象,因此您应该能够将回调附加到其onreadystatechange
事件,或将回调传递给aFunc
:
function aFunc(callback) {
object.event = function() {
var result = true;
callback(result);
};
}
然后在可用时调用结果调用回调。
答案 1 :(得分:3)
你可以将一个对象传递给闭包,它在调用函数时会设置其属性'result'。
function aFunc (foo) {
object.event = function() {
foo.result = true;
}
}
问题是result
的值由aFunc
返回,而不是对它的引用,这意味着在闭包内发生的result
的任何后续更改都不会影响之前返回的result
。
答案 2 :(得分:2)
这是不可能的;代码
object.event = function(){
result = true;
}
实际上并不执行result = true;
,它只是定义了一个将result
设置为true
的函数。在调用函数之前使用result
会产生一个未定义的值。
有两种解决方案:
您可以使用容器(如Qnan所建议)
您可以使用回调。
第二种方法意味着:不要立即使用result
,只要object.event
具有一些有用的值,就让result
后面的函数调用一些代码:
object.event = function(){
result = true;
callback(result);
}