2010-08-24 38 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' 

您可以通過關閉更復雜。