之前有看到一个问题是说JavaScript中Function.prototype.apply和Function.prototype.call在底层实现上有什么区别。
今天特地去查了一下ECMAScript的文档,发现两者的底层实现都是最终调用了PrepareForTailCall和Call这两个抽象方法,说明它们的底层机制是一样的,只不过call在调用的时候会新创建一个抽象的List来打包参数罢了。
另外值得一提的是,我发现apply在把Array变成List的时候会调用CreateListFromArrayLike这个抽象方法,这意味着在js中调用函数的apply方法传回调参数时,我们也可以传一个类数组对象进去~
今天特地去查了一下ECMAScript的文档,发现两者的底层实现都是最终调用了PrepareForTailCall和Call这两个抽象方法,说明它们的底层机制是一样的,只不过call在调用的时候会新创建一个抽象的List来打包参数罢了。
另外值得一提的是,我发现apply在把Array变成List的时候会调用CreateListFromArrayLike这个抽象方法,这意味着在js中调用函数的apply方法传回调参数时,我们也可以传一个类数组对象进去~
展开
评论
11
![[流泪]](http://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_6.dde0d83.png)