call和apply方法网上相关文章很多,大多是用简单的代码demo举例,这里用打比方的方式瞎扯下这两个方法到底是干嘛的?
回答这个问题前,先要明确一点,就是“JS是一门面向对象的语言”,JS处处是对象,而对象就是一个同时包含属性和方法的整体。比如数组对象Array,就有length属性,也有shift方法。“对象”就像一个家庭,“属性”就是家里的没有生命的家电家具,“方法”则是家庭的人类成员。
假设王家是穷光蛋,家徒四壁,李家是土豪,应有尽有。这是王家的儿子想过李家的日子,他要怎么办?最简单的方法就是改姓“入赘”成为李家人,成了一家人后,李家的东西就随便王二用了。这个“入赘”改姓入籍别人家享福的行为在JS世界就叫call或者apply。入赘别人家后自己老家的东西还能不能用呢?答案是一样用,JS的call和apply也是这样。
比如代码obj1.fn1.call(obj2)的意思在客观世界就是,obj1家的穷光蛋fn1入赘到obj2家,然后穷光蛋fn1就可以随便用土豪obj2家的东西了。同时,obj1.fn1.call(obj2)和obj1.fn1.apply(obj2)功能是一样的,那apply和call有啥区别呢?它们的区别就在传参的方式上,call和apply的第一个参数都是对象名(要入赘的家庭),后面都是参数,区别就是call的参数要一个个传,像obj1.fn1.call(obj2,1,2,3)这样,但是apply要用数组打包一起传,像obj1.fn1.call(obj2,[1,2,3])这样。
这里说call和apply是“入赘”的意思也不合适,感觉比喻成"结婚"更合适,参与结婚的人就同时成为了两家的人,然后两家的东西都可以用。再回到代码代码obj1.fn1.call(obj2)的意思,那就应该说是,obj1家的fn1嫁到obj2家,从此fn1在obj1和obj2家都像自己自己家一样,东西随便用。不过,一般用了aplly方法后,主要是想用obj2对方家的东西.
有的人可能会说,你能不能不扯淡,给我用可以运行的代码举个例子说说,那我就自荐一篇自己之前的文章:《apply和call对this的影响》