JS中如何获取函数调用者?

// plugins.js
export default {
    install(Vue){
        Vue.prototype.$util = util
    }
}
// util.js
export default {
    test(args0,args1){
        // 如何将这里的this改为调用者,如this.$util.test()中的this
        // 一开始是作为参数传入的,后来改为在调用时使用apply指定this
        // 目前调用方式:this.$util.test.apply(this,[1,2])
    }
}

补充

一开始没说清楚,其实我想知道除了apply跟call之外还有没有别的方式可以将test内部的this指向调用者

// 如何这样调用test,test内部也能拿到该this的属性与函数?
this.$util.test()

补充二

目前考虑Vue的mixin,将该工具函数作为methods混入组件实例中

阅读 2.8k
2 个回答

这样你就可以直接访问this.$util.test()

// plugins.js
export default {
    install(Vue){
        Vue.prototype.$util = {
            test: util.test.bind(Vue)
        }
    }
}

题主的需要指向的 this 应该是指 vue 实例对象吧?

如果是这样的话,直接改成箭头函数就行了

// util.js
export default {
  test: (args0, args1) => {
    // 在箭头函数中,this将自动绑定到 【定义时】 所在的作用域,
    // 因此它会指向调用者(即Vue实例)
    console.log(this); 
  }
}

当然,使用 applybindcall 也能实现

关于题主补充的问题:

显式绑定的话,就 applybindcall,如果只是会影响作用域的还包括 函数声明、类声明、严格模式 等

// 如何这样调用test,test内部也能拿到该this的属性与函数?
// 也就是说调用时不想体现任何显式影响,那么就可以考虑一开始就绑定正确的 this,比如使用 【箭头函数】,具体方式看上文
this.$util.test()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题