2012-04-05 136 views
1

對不起,我最後一個問題。這是更好格式化的問題。如何通過另一種方法傳遞方法而不調用它,並將變量對象傳遞給它?

我有我傳遞的方法,通過一個方法:

method("my_passed_method()") 

function method(passed_method){ 
    eval(passed_method.replace('()', + '(' + obj + ')'); 
} 

但這返回:

SyntaxError: missing ] after element list

我假定這只是一些簡單的JSON語法錯誤。

+0

在你的代碼中有一個錯誤+ ..... – 2012-04-05 15:18:35

+1

這裏有幾個很好的答案。在javascript方法中,函數是可以像任何其他對象一樣傳遞給其他函數的對象。 eval也是邪惡的。 – 2012-04-05 15:25:38

回答

2

方法的名稱是在同一時間引用該方法對象。括號(可選地帶有它們之間的參數)使javascript調用該方法。這意味着您的代碼可以被重寫爲:

method(my_passed_method) 

function method(passed_method){ 
    passed_method(); 
} 

那麼,這是怎麼回事? 當您傳遞名稱my_passed_method時,javascript引擎會查看該名稱映射到的內容,並發現它映射到一個functio對象。 比在方法的函數調用中,該對象被分配給參數名稱`passed_method。除此之外,在這個名字後加上括號會使javascript嘗試執行該對象,這確實是可能的,因爲這個對象是一個函數,就像任何其他類型一樣,函數就是我們所說的第一類citezens。你可以像對待任何其他值一樣對待它們,方法是將它們分配給變量並傳遞給它們。

4

我想你也許想要這個:

method(my_passed_method) 

function method(passed_method){ 
    passed_method(obj); 
} 

注意,當你調用method,你傳遞一個函數參考,而不是一個字符串,你不調用my_passed_method(後面沒有()),你只是指它。

method之內,您通過變量passed_method調用函數,因爲該變量包含函數引用。

在JavaScript中,函數是第一類對象。變量可以參考他們,你可以通過他們周圍等

下面是一個完整的,獨立的例子:

// The function we'll pass in 
function functionToPass(arg) { 
    display("functionToPass's arg is: " + arg); 
} 

// The function we pass it into 
function functionReceivingIt(func) { 
    func("foo"); 
} 

// Do it 
functionReceivingIt(functionToPass); 

Live copy | source

0

在Javascript函數中被視爲對象。您可以將它們作爲參數傳遞給其他函數,如下所示。

function something(x){ 
alert(x); 
} 

function pass(func){ 
    pass2(func); 
} 

function pass2(func){ 
    func("hello"); 
} 

pass(something); //alerts hello 

演示: http://jsfiddle.net/wBvA2/

0

eval是惡;或者他們說。你並不需要通過功能作爲一個字符串你可以通過函數本身,然後使用Function.callFunction.apply來傳遞參數(或乾脆直接稱呼它):

method(my_passed_method); 
function method(passed_method) { 
    passed_method(obj); 
    // OR: passed_method.call(window,obj); 
} 

其中eval是必要的情況下,是非常罕見的。

請注意,您的代碼會將obj評估爲javascript,因此輸出可能會有所不同。

相關問題