call()、apply()

来源:互联网 发布:树上10只鸟 程序员 编辑:程序博客网 时间:2024/06/10 01:36

功能

  • 相同点:都是为了改变某个函数运行时的上下文环境,即改变函数内部的this指向。
  • 不同点:接受参数的方式不一样。

看下面的例子:

var a = 1;var obj = {a:2}function foo(){    console.log(this.a);}foo();    //1foo.call(obj);    //2foo.apply(obj);    //2

他们的功能是一样的,将foo()里面的this绑定到了obj这个对象上,原本输出window.a变成了输出obj.a,这就是call()和apply的作用。


再看一个例子:

    var obj={"name":"john"};    var obj1={"name":"kite"};    function foo(a,b)    {        console.log(this.name+" like "+a+" and "+b);    }    foo.call(obj,"apple","milk");    //john like apple and milk    foo.apply(obj1,["banana","water"]);    //kite like banana and water

这就是他们的差别了,他们的第一个参数都是this需要指向的东西,但是后面的参数呢,call把他们一个一个的列在后面,apply则是把他们组成一个数组作为参数,很简单吧。


提示

当我们知道某个函数的参数个数时候,用call;当我们不确定参数个数时,用apply,把参数一个个push到一个数组里面传进去。当然,你也可以使用arguments数组来遍历(不过es6已经不支持arguments了哦,改用三个点吧)。


用途

比如有一个对象cat(),他有一个方法eat(),然后又出现了一个新的对象dog(),他没有这个方法,但是这个dog()对象也希望使用eat()方法。
看下面的例子

    var cat={            food:"fish",            eat:function(){    //这个方法是cat有的                console.log("I like "+this.food);            }        }    cat.eat();    //I like fish    var dog={food:"bone"};    cat.eat.call(dog);    //I like bone
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕初期胃疼的厉害怎么办 怀孕胃疼的厉害怎么办 天然气热水器风口一封闭怎么办 热水器着火后火变大怎么办? 人如果没有天魂怎么办 被鬼魂附体了该怎么办 被吸血蠓咬了怎么办 股份公司大股东占用资金怎么办 抱小孩抱的胳膊疼怎么办 一个月好几个性伴侣怎么办 惹了势力大的人怎么办 给佛像换新法器旧的怎么办 cad填充图案拾取不了点怎么办 cad填充图案太密怎么办 桃木葫芦挂件裂口了怎么办 皮肤被太阳晒伤变黑怎么办 皮肤又粗又黑该怎么办 盆栽红薯长疯了怎么办 四叶草叶子发黄怎么办 美篇不想让别人看到怎么办 黑魂3暗灵入侵怎么办 问道手游账号忘了怎么办 问道手游密码忘了怎么办 毒蚂蚁咬了红肿怎么办 电脑开机后有电流声怎么办 小学生阅读方面不会总结怎么办 天龙八部手游转职装备怎么办 投简历没回应该怎么办? 开车开的腰疼怎么办 开车腰疼怎么办吃什么 58简历投错了怎么办 开了一天车腰疼怎么办 开车腰疼怎么办怎么解决好 球球大作战找不到主界面怎么办 在QQ上找不到主界面怎么办 mac地址被过滤了怎么办 续贷声明含非法字符怎么办 辞职老板不给结工资怎么办 辞职后老板不发工资怎么办 联想手机不自带系统升级怎么办 苹果6玩崩坏3卡怎么办