8. call-apply-bind
call-apply-bind的作用,就是改变普通函数中的this指向
call
语法:函数名.call(this指向谁, 原来的参数队列)
(1)函数立即执行
(2)改变函数中的this为指定的第一个参数
apply
语法:函数名.apply(this指向谁, [原来的参数队列])
(1)函数立即执行
(2)改变函数中的this为指定的第一个参数
bind
语法:函数名.bind(this指向谁, 原参数1, 原参数2)
(1)函数不会立即执行,而是返回一个新的改变this指向后的函数
注意:
call和apply的相同点和区别
(1)相同点:都能改变this指向,函数都会立即调用
(2)不同点:传递参数的方式不同,call:参数队列,apply数组
call-apply和 bind的区别
(1)call 、apply 函数会立即调用(2)bind函数不会立即调用,而是返回一个新的函数
/**
* 普通函数的this指向,只跟调用的时候调用者有关,跟在哪里定义的,在哪里调用的没关系
* 孙冬泉.吃() 在哪里吃 吃方法在哪里定义的都没关系
*/
// chi方法定义在 window作用域
function chi(){
console.log('chi this: ', this);
}
//chi(); // this window 因为调用者是window
var obj = {
ff:function(){
chi(); //
},
ff99:chi
}
obj.ff();
obj.ff99();
// 如何改变一个函数中的this指向
/**
* 1. 函数名.call(this指向谁, 原参数1,原参数2,.....)
* (1) 函数立即执行
* (2) 改变函数中的this为指定的第一个参数
*
*/
function study(name,time){
console.log('name: ', name, 'time: ', time);
console.log('study this: ', this);
}
study('马万佳',30);
var obj1 = {
name:'焦龙超'
};
var obj2 = {
name:'郑向前'
}
study.call(obj1,'yy', 10);
/**
* apply
* 语法:函数名.apply(要改的this, [原参数1,原参数2,....])
*
* (1) 函数立即执行
* (2) 将函数中的this,改为第一个参数
*/
study.apply(obj2,['xx',20])
/**
* bind
* 语法: 函数名.bind(要改的this, 原参数1,原参数2,.....)
*
* (1) 不会立即执行函数,而是返回一个新函数,新函数的this指向已经被改变为第一个参数了
*
*/
console.log('----bind-----');
var resFn = study.bind(obj1, 'zyx',20);
console.log('bind返回的函数', resFn);
resFn();