2014-12-02 38 views
-2

JavaScript大師!我意識到這個問題的標題可能有點混亂。但我不知道如何解釋它。如何判斷一個函數是否作爲另一個函數的參數被調用?

所以讓我只舉一個例子:

function foo(txt){ 
    return "Hello " + txt); 
} 
function bar(txt){ 
    if(/* bar is called as an argument */) return txt; 
    if(/* bar is called normally */) return "Bar"; 
} 

foo(bar("world!")); //Returns "Hello World"; 
bar("world!");  //Returns "Bar"; 

我想吧()做一些不同的東西,如果它被稱爲比,如果它被稱爲它自己的另一個函數的參數。 (bar(「world!」));如果它是另一個函數中的參數或者不是,因爲它似乎當瀏覽器運行foo(bar(「world!」))時,我似乎無法找到任何方式讓bar()它首先運行bar(「world!」),然後給出foo(),這是bar()的結果。

我以爲我可以檢查bar()的調用堆棧,因爲我認爲foo()正在調用它。但它被foo()調用之前調用foo()的相同函數調用。

我開始覺得這是不可能的。

編輯: 所以很明顯大多數人,爲什麼我會想這樣做有點困惑。

我正在使自己成爲一個快速構建HTML元素的函數。 我可以調用函數,只是傳遞我希望他們能夠連接到父元素和一堆標籤名稱的,它創造這些標籤,並將它們附加到父元素

obj = c(tableElement,"td","td","td") 

這將創建3個細胞將它們附加到我的桌子上。但不會返回任何東西。因此:

obj = undefined 

監守,但如果我改變原始代碼這個沒關係:

obj = c(tableElement,"td","td",true,"td") 

那麼它會做同樣的事情。而是將第二個單元格傳遞給obj,以便稍後再次使用該單元格。

它來派上用場,當我想使用Javascript來建立一堆東西,其中大部分我不需要操縱事後。

它一切正常,直到我開始添加嵌套元素的能力。 EX:

obj = c(tableElement,"tr",c("td",true,"td",true,"td",true),"tr",true) 

這實際上運作良好輸出:

<table> 
    <tr> 
     <td></td> 
     <td></td> 
     <td></td> 
    </tr> 
    <tr></tr> 
</table> 

和OBJ =只有第二行元素。

現在我試圖完成所有這一切的技巧。我不想在我的嵌套c()函數中需要TRUE參數。它們不是必需的,因爲無論如何它們都是必需的。如果我有某種方式知道它是嵌套的。那麼我可以忽略TRUE參數,我的代碼會更加簡潔。

我也希望能夠讓其中一個嵌套單元格能夠返回到obj變量。

我在想我唯一的選擇是創建第二個函數,它的作用與嵌入元素的創建者有點不同。

+2

但是你沒有傳遞一個函數作爲參數,你調用該函數並傳遞返回的字符串作爲參數,這就是添加括號所做的事情,將函數作爲參數傳遞,你必須做'富(酒吧);' – adeneo 2014-12-02 23:48:59

+1

我不知道你爲什麼要這樣做。 – soktinpk 2014-12-02 23:50:34

+1

我想我現在就明白了,不行,你不能這樣做,bar'函數不知道它是以什麼方式與你調用函數foo相關的。 – adeneo 2014-12-02 23:52:20

回答

0

要找出函數調用的上下文,可以使用Function.caller(它將取代arguments.caller)。

function bar() { 
    console.log(bar.caller); 
} 

然而,由於雙方的函數調用是由相同的代碼級別進行,他們將返回相同的結果(或null如果調用是從頂級代碼)。
因此,你想要的是不可能的。另外,爲什麼你想要做到這一點?

1

你要求的東西沒有多大意義。函數式編程背後的關鍵原理是函數的執行僅基於函數執行過程中提供的參數。如果你想區分這兩個函數,你需要提供一個額外的參數,通知你這個函數應該調用哪個部分。在你的情況,我會想像這樣的事情:

function foo(txt){ 
    return "Hello " + txt); 
} 

function bar(argument,txt){ 
    if(argument) return txt; 
    else return "Bar"; 
} 

foo(bar(true,"world!")); //Returns "Hello World"; 
bar(false,"world!");  //Returns "Bar"; 

我認爲這可能會解決您的具體情況的問題。

UPDATE:

嗯,我明白你的問題,但他們的方式,你正在試圖解決您沒有太大的意義。我可以立即告訴你,你試圖介紹的這個解決方案不會以任何明智的方式擴展。從JavaScript創建HTML文檔通常是一個糟糕的主意。請考慮使用http://handlebarsjs.com/並節省大量時間。

相關問題