JavaScript 参数传递的是另一个函数、如何执行?

示例:


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

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

以问:

多次if判断type或用switch,然后去调用itme里的方法,这种不适合我的业务场景,因为itme对象后续会扩展。

假设我已经统一对参数进行判断了,确定itme中有type这个方法,我应该如何调用它呢?用户可能会传abcd..N方法名。

补充:由于是严格模式的原因,eval函数不能使用了。

阅读 2.6k
3 个回答
var item = {
    a: function () {console.log('a');},
    b: function () {console.log('b');},
    c: function () {console.log('c');}
}
function test(type){
    item[type]();
}
test("a");

如果你是这么调用test方法的test('a')
那么想调用到对应的方法就是item[type]

test() 的参数只需要一个 fn(函数)对象就好,不用管它是哪来的。如果想绑定它一定是在 item 上进行调用,那 item 必须在 test() 内可用,

  • 在传入 key 的情况下可以用 item[key]() 来调用;
  • 在传入 fn 的情况下可以用 fn.apply(item) 或者 fn.call(item) 来调用;
  • 但是如果传入的 fn 是绑定(.bind(obj)) 到其它对象上的,无论如何都不可能在 item 上调用

基于第 3 点,在 test() 不能访问 item 的情况下,可以不限制 test() 的参数,只要求是函数就行,如果需要绑定对象,可以由调用者自己绑定 item

如果是要严格控制在 item 上调用,可以用 OOP 思想对 item 进行一个封装(当然不封装也可以实现),但在调用的时候给的不是 fn,而是一个 key,先进行 key 在 item 中的有效性判断,再通过 item[key]() 来调用。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题