在JavaScript中,call、apply和bind是Function对象自带的三个方法,都是为了改变函数体内部 this 的指向。apply 、 call 、bind 三者第一个参数都是 this 要指向的对象,也就是想指定的上下文;apply 、 call 、bind 三者都可以利用后续参数传参; bind 是返回对应 函数,便于稍后调用;apply 、call 则是立即调用。
// 首选定义一个函数 fn1, 并且给它定义两个形参
function fn1(a,b) {
console.log(this);
console.log(a);
console.log(b);
return '运行结束';
}
// fn1 函数正常运行的结果
function fn2() {
fn1('普通参数一', '普通参数二');
return '执行完毕';
}
// 使用 call 改变 this 指向之后的的结果
function fn3() {
fn1.call('测试CALL', '北京', '上海');
return '执行完毕';
}
// 使用 apply 改变 this 指向之后的结果
function fn4() {
fn1.apply('测试APPLY', ['亚运村', '波音747-400']);
return '执行完毕';
}
// call可以继承父级的属性和方法
function A() {
this.abc = '南京';
}
function B() {
A.call(this);
}
// 通过以下两种赋值的方法使 A 和 B 原型上的方法实现共享
A.prototype = B.prototype;
B.prototype = A.prototype;
// 通过深克隆的方法实现仅 A 原型的方法单向的共享给 B
for(var i in A.prototype) {
B.prototype[i] = A.prototype[i];
}
A.prototype.sayA = function() {
console.log('我是A()原型上的方法。');
}
B.prototype.sayB = function() {
console.log('我是B()原型上的方法。');
}
// 实例化创建一个 obj1 和 obj2,可查看二者原型上的方法有什么不同
var obj1 = new A();
var obj2 = new B();
// 下面定时器中的 this 原本是 window,但是我们通过 bind 将 window 扭转为 #document
document.onclick = function () {
console.log(this);
setTimeout(function () {
console.log(this)
}.bind(this), 1000)
}
发表评论