apply、call、bind

apply、call

在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。(难理解是吧,我也觉得。。。)

JavaScript 的一大特点是:
函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。

改变作用域:
当对象A 没有某个方法,可以将对象B的某个方法放在A的作用域中并执行,执行时这个方法this指向A。

我觉得看代码加注释,这样最好理解了,so

var apple ={
    color: "red",
    say: function(a,b,c) {
        console.log(a,b,c);
        console.log(this.color);
    }
}
var banana = {
    color: "yellow"
}
apple.say(1,2,3);    //1,2,3; red

// apply,call区别就是传递参数方式不同
apple.say.apply(banana,[1,2,3]);  //1,2,3; yellow   //数组作为参数传递
apple.say.call(banana,1,2,3);     //1,2,3; yellow   //依次传递参数
/*
*  apply,call都是将apple.say放在banana作用域中执行,
*  你可以简单的看成在banana有个say方法, 是apple.say的拷贝
*  (但是在banana中实际并没有say方法)
*/

bind

作用:用于为调用函数绑定一个作用域

说明:
1,bind()方法会创建一个新函数,称为绑定函数,
2,绑定函数会以创建它时传入 bind()方法的 第一个参数作 为 this,
3,绑定函数调用时会将 bind() 方法的第二个及以后的参数加上 绑定函数的参数 传入原函数。

function bar(){
     console.log(this.a , ...arguments);//...arguments是将[1,2]展开:1,2
}
var foo1={
    a:1
}
var foo2={
    a:2
}
var fn0=bar.bind(foo1,'说明2');  fn0();  //1,'说明2'
var fn1=bar.bind(foo1,6);  fn1('说明3');    //1,6,'说明3'


注:
1,var fn0=bar.bind(foo1,6); fn0();
可以为立即执行:bar.bind(foo1,6)();

2,多次 bind()中this以第一个为准,参数依次叠加
 bar.bind(foo1,undefined).bind(foo2,5)();// 1 undefined 5


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容