2014-02-25 152 views
0

如果我調用函數傳遞參數參數(其中調用異步函數B),異步函數B的回調函數C將能夠使用給定的參數參數函數A?如果是的話,如果在函數B start和回調C之間的時間內調用,我會重新調用函數A嗎?在調用函數的回調函數中使用參數

實施例:

function A(param) { 

    value1 = param; 
    doc = "hello"; 
    //this is the async function B; 
    database.insert(doc, function() { 
    //this is the invoked callback C when the async function is solved. 

    console.log(value1) 

    //can i log value1? yes. if yes, will this change if i re-invoke 
    //function A before the callback is invoked or two different processes will start? 

    }) 


} 


A('hello'); 
A('not hello'); 

想知道這一點,如果在第二時間函數的先前調用的回調函數調用之前,將打印在控制檯右側的值:

你好; 不是你好;

並且從不 不是你好; 不是你好;

導致第二次調用第一次感染。

+1

**用'var'聲明你的局部變量** – Pointy

+0

先謝謝你。這是需要正確的工作還是隻是建議? @Pointy – Morrisda

+0

這只是一個非常重要的習慣,也是一個重要的理解。 – Pointy

回答

3

是的,傳遞給database.insert()的內聯回調將能夠看到傳遞給函數A()的參數。一個函數可以訪問包含函數中的任何參數或甚至局部變量。

而且,每一個都將單獨保存,因此您可以根據需要多次調用A(),並且它們各自保留單獨的參數。

這個概念被稱爲閉包,爲每個A()的調用創建一個單獨的閉包,只要其中的任何代碼(包括異步回調)尚未完成,閉包就會保持活動狀態。

雖然你需要在他們面前聲明你的局部變量爲var,因爲它們是真正的局部變量,對於每次調用A()都是唯一的。如果沒有var,它們將成爲隱式全局變量,並且一次調用A()將與另一個A()調用的全局變量混淆。如果你不喜歡這樣,你是安全的:

function A(param) { 

    var value1 = param; 
    var doc = "hello"; 
    //this is the async function B; 
    database.insert(doc, function() { 
    //this is the invoked callback C when the async function is solved. 

    console.log(value1); 
    console.log(param); 
    console.log(doc); 

    //can i log value1? yes. if yes, will this change if i re-invoke 
    //function A before the callback is invoked or two different processes will start? 

    }) 


} 


A('hello'); 
A('not hello'); 
+0

好的,謝謝你。但是如果我在第一次調用回調被解決之前第一次調用後重新調用函數,這個值是否會改變?我的意思是,第一個調用callbak將打印第一個傳遞的參數? – Morrisda

+0

@Morrisda - 查看我的更新。 – jfriend00

+0

好的,這解決了我所有疑惑的傢伙。非常感謝! – Morrisda

0

爲了使變量value1在回調封捕獲,您需要將其聲明爲一個局部變量:

var value1 = param; 
+1

函數參數也是閉包的一部分。不需要將其分配給局部變量。 – jfriend00

+1

這是真的,但他在回調中沒有使用參數,他使用'value1'。所以我展示瞭如何捕捉它。在這個示例程序中它們是可互換的,但在實際應用中它們可能不是(例如'var value1 = param * something')。 – Barmar