call,apply,bind的区别

来源:互联网 发布:问道源码大全 编辑:程序博客网 时间:2024/05/18 23:58

以下例子都以这个对象为基础

var people = {    user: "zhengwenlong",    getAge: function (birth) {        var date = new Date;        console.log(this.user +':'+ (date.getFullYear() - birth))    }};

单纯调用获得年纪这个方法:

people.getAge(1993);  //zhengwenlong:24

上面代码如我们所愿,能打印出来zhengwenlong:24(当然,只有你本机时间是2017年的时候)

接着换一种方法来试一下:

var p = people.getAge;    p(1993); //undefined:24

名字哪儿去了?咋成了undefined?这里就又要开始说this了,调用p的时候this指向到了window,window下没有user啊,所以就成了undefined

这里可以验证一下这个说法是否成立

在定义people这个对象之前先定义一个master

var user = "master"var people = {    user: "zhengwenlong",    getAge: function (birth) {        var date = new Date;        console.log(this.user +':'+ (date.getFullYear() - birth))    }};var p = people.getAge;    p(1993); //master:24

打印出来master:24,没毛病

虽然有方法来实现这个查看年纪的方法,但是有些时候不得不把这个对象保存到另外的一个变量中的时候,可以通过以下方法

一、call

var p = people.getAge;p.call(people, 1993)//zhengwenlong:24

这个也能很好的调用到people对象内部的变量及方法

call方法能改变函数执行的上下文,也就是this的指向,第一个参数就是你希望的this指向,后面的参数是你调用的这个函数的里面需要传的值,这里可以传多个值
你也可以这样

//只做示例var p = people.getAge;p.call(people, 1993, 11, 02);

二、apply

apply的用法和call基本类似,只不过后面的参数以数组形式传递,数组里面对应的就是函数里面接受的参数

//只做示例var p = people.getAge;p.call(people, [1993, 11, 02]);

如果call和apply的第一个参数写的是null,this指向的是window对象

三、bind (ES5)

var p = people.getAge;b = p.bind(people, 1993);

what?为啥控制台什么也没有,我们来看看这个b到底是个什么鬼?
来试一下

var p = people.getAge;var b = p.bind(people, 1993);console.log(b);//ƒ (birth, a) {//    console.log(birth, a)//    var date = new Date;//    console.log(this.user + ':' + (date.getFullYear() - birth))//}

soga,b原来是一个函数,那我们就只好这样来用了

var p = people.getAge;var b = p.bind(people, 1993);b();//zhengwenlong:24

当然也是可以传多个值的

//只做示例var p = people.getAge;var b = p.bind(people, 1993, 12, 09);b();

还能这样用

//只做示例var p = people.getAge;var b = p.bind(people, 1993);b(12, 09);//根据接收的参数顺序往后排列
原创粉丝点击