JS bind方法是如何实现的?有研究过源码的吗?

Crushdada
  • 101

最近整理了一篇手撕bind方法的文章
一个疑问?
我们模拟实现bind方法,终归是通过apply实现的。而它源码是如何实现的,对于我来说就像一个黑盒。也就是说:不用apply,它是如何实现?


已经得到了我想要的答案
虽然..其他答友提到JS源代码的实现可能是C/C++
但是,感谢jsdeferred的解答,使得我能够不借助apply手撕bind

完整版手撕bind代码及逻辑实现过程已经整理到我的个人博客:Crushdada's Blog 以及思否文章

回复
阅读 436
3 个回答

回想一下你问的这个问题

const bind = (context, func) => {
  return (...args) => {
    context.__INTERNAL_SECRETS = func
    try {
      return context.__INTERNAL_SECRETS(...args)
    } finally {
      delete context.__INTERNAL_SECRETS
    }
  }
}

bind({ a: 1 }, function () {
  console.log(this.a)
})()

ECMA 只规定表现,具体如何实现取决于各家浏览器引擎。

以 V8 为例,相关源码主要散落在 src/runtime.ccsrc/profile-generator.ccsrc/factory.cc 等几个文件里,感兴趣的话可以自行阅读相关的 C/C++ 代码。

P.S. 所有原生方法对你来说都是黑盒的,你要关心为啥只关心 apply

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

宣传栏