2010-08-24 40 views
0

我仍然试图理解JavaScript范围。从匿名回调函数返回值的最简单方法是什么?例如,从匿名回调中传递值的最简单方法?

var test = 'outside'; 
callsFunction(function() { test = 'inside'; }); 
console.log(test); 

其中callsFunction调用匿名函数。我希望打印'里面'。

+0

嗯,不知道我明白这个问题,你能否详细说明你的例子? – nicomen 2010-08-24 20:19:57

+0

我相信匿名函数的作用域被定义在callsFunction被定义的任何地方,并且可能无法访问测试变量。 – Tristan 2010-08-24 20:22:46

回答

2

我有点困惑,但我相信这是你以后

function callsFunction(fn) 
{ 
    fn(); 
} 

var test = 'outside'; 
callsFunction(function() { test = 'inside'; }); 
console.log(test); 

注意,任何功能可以通过的()使用调用在做什么。不过,也有特殊的方法从不同的上下文中调用的功能,如Function.call()Function.apply()

+0

好吧,这是我的想法,但它对我来说并不适用,其中callsFunction是ajax调用,而我的匿名函数是成功回调。也许我有一个不同的问题? – Tristan 2010-08-24 20:28:54

+1

由于AJAX的异步特性,使用回调作为AJAX过程的一部分是不同的。如果你有AJAX问题,你需要发布具体的细节。 – 2010-08-24 20:31:04

+0

是的,这是问题所在。实际调用回调之前,我正在使用console.log。 – Tristan 2010-08-24 20:33:25

2

在指出了明显的风险,有一些回调后做的最简单的方法是简单地将其包括在回调(而这,其实要走的路):

var test = 'outside'; 
callsFunction(function() { 
    test = 'inside'; 
    console.log(test); 
}); 

一个真实的例子:假设您想更新的文件从一个Ajax调用的内容的DIV。

Ajax('file.html', function (data) { 
    // Update the div here 
    document.getElementById('d').innerHTML = data; 
}); 

// Not here 
+0

谢谢,但我确实在回调上下文之外使用它。 – Tristan 2010-08-24 20:30:03

+0

你打算如何使用它?也许发布一些实际的代码? – 2010-08-24 20:33:27

+0

您应该创建一个单独的方法来完成常规工作,并从回调以及您需要的任何地方调用它。 – 2010-08-24 21:18:50

1

也许你是想研究什么是JavaScript的关闭

0

你没有在你的问题定义callsFunction,但如果你把它自调用匿名函数,可以返回新的“测试”值:如果你定义callsFunction

var test = 'outside'; 
(function() { test = 'inside'; })(); 

console.log(test); // returns 'inside' 

var test = 'outside'; 
var callsFunction = function() { 
    test = 'inside'; 
    return test; 
}; 

console.log(callsFunction()); // returns 'inside' 

您可以通过关闭更复杂。