2010-11-21 50 views
1

我試圖p的值傳遞給報警功能 - 不幸的是,在它只是出來作爲未定義的時刻。我認爲這個問題是因爲當這個函數被調用時p不存在了。我將如何通過p該功能,並使其保留的價值?傳遞一個變量的函數(範圍問題)

function B(p,u) { 
    var foo = {}; 
    foo[u] = function(p) { 
     alert('visit internal page '+p); 
    }; 
    $.router(foo); 
} 

B("about", "!/about"); 

回答

3

剛剛離開它從參數列表,像這樣:

function B(p,u) { 
    var foo = {}; 
    foo[u] = function() { 
     alert('visit internal page '+p); 
    }; 
    $.router(foo); 
} 

您目前的內部函數指定參數p,除非這是當它被稱爲提供的(似乎並不它是)更多的本地p變量將是undefined。相反,不要將其指定爲參數,它將使用父範圍中的p

+0

奇妙的是,這比我預期的要容易!不知道爲什麼這樣做,但我必須做一些研究。感謝你的回答! – RichW 2010-11-21 11:02:47

+1

@RichW - 可以使用父範圍中的任何變量,但是必須指定任何*級別的函數上的任何參數,所以當你有'function(p)'時,只需通過'foo [u ]()',它將會是'undefined' ...因爲你沒有傳遞任何參數,但是通過將它關閉,它可能使用的唯一的'p'就是父範圍中的那個......這樣做更有意義嗎? – 2010-11-21 11:08:33

+0

現在感覺非常完美,謝謝Nick!不幸的是,這些問題之一似乎很難在Google上進行研究,因爲您不知道該鍵入什麼內容! – RichW 2010-11-21 11:12:14

1

問題是你有兩個p變量在同一時間。

function B(outer_p, u) { // <- first p 
    var foo = {}; 
    foo[u] = function(inner_p) { // <- second p 
     alert('visit internal page '+ outer_p); // depending on what 
    };           // you want to display here 
    $.router(foo); 
} 
+0

我希望p的值可以通過函數繼承(猜測它不能像那樣工作!)。謝謝(你的)信息! – RichW 2010-11-21 11:03:47

+0

你的繼承意味着什麼?外部'p'可用於您的內部功能。 **但是**如果你在內部函數參數列表中聲明瞭'p',它將被默認分配'undefined'並且由於名稱衝突將覆蓋/隱藏外部'p'。 – galambalazs 2010-11-21 11:35:17