鍍金池/ 問答/HTML/ JavaScript 參數(shù)傳遞的是另一個函數(shù)、如何執(zhí)行?

JavaScript 參數(shù)傳遞的是另一個函數(shù)、如何執(zhí)行?

示例:


var item = {
    a: function () {},
    b: function () {},
    c: function () {}
}

function test(type) {
    // item.type()
}

以問:

多次if判斷type或用switch,然后去調(diào)用itme里的方法,這種不適合我的業(yè)務(wù)場景,因為itme對象后續(xù)會擴展。

假設(shè)我已經(jīng)統(tǒng)一對參數(shù)進行判斷了,確定itme中有type這個方法,我應該如何調(diào)用它呢?用戶可能會傳abcd..N方法名。

補充:由于是嚴格模式的原因,eval函數(shù)不能使用了。

回答
編輯回答
好難瘦

test() 的參數(shù)只需要一個 fn(函數(shù))對象就好,不用管它是哪來的。如果想綁定它一定是在 item 上進行調(diào)用,那 item 必須在 test() 內(nèi)可用,

  • 在傳入 key 的情況下可以用 item[key]() 來調(diào)用;
  • 在傳入 fn 的情況下可以用 fn.apply(item) 或者 fn.call(item) 來調(diào)用;
  • 但是如果傳入的 fn 是綁定(.bind(obj)) 到其它對象上的,無論如何都不可能在 item 上調(diào)用

基于第 3 點,在 test() 不能訪問 item 的情況下,可以不限制 test() 的參數(shù),只要求是函數(shù)就行,如果需要綁定對象,可以由調(diào)用者自己綁定 item。

如果是要嚴格控制在 item 上調(diào)用,可以用 OOP 思想對 item 進行一個封裝(當然不封裝也可以實現(xiàn)),但在調(diào)用的時候給的不是 fn,而是一個 key,先進行 key 在 item 中的有效性判斷,再通過 item[key]() 來調(diào)用。

2018年6月23日 05:16
編輯回答
瞄小懶

如果你是這么調(diào)用test方法的test('a')
那么想調(diào)用到對應的方法就是item[type]

2017年8月31日 13:30
編輯回答
歆久
var item = {
    a: function () {console.log('a');},
    b: function () {console.log('b');},
    c: function () {console.log('c');}
}
function test(type){
    item[type]();
}
test("a");
2017年12月8日 07:23