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