改变函数内部this指向一共有三种方法,分别为call方法,apply方法和bind方法。
总结: call方法与apply方法,作用,效果,都是完全一致的
只是对于原始函数的参数赋值方法,不同
call方法是通过其他多个参数来实现
apply方法是通过一个数组参数,来实现
两个方法没有本质的区别,可以随意选择
总结:
call apply 都是立即执行函数
参数1,都是改变的this指向
其他参数,是原始函数的形参(可以有,也可以没有)
bind 不是立即执行函数,是生成一个新的函数
参数1,是改变的this指向
就使用原始函数的形参
示例:
<script>
//call方法
var o = {
name: 'andy'
};
function fn(a, b) {
console.log(this);
console.log(a + b);
};
fn.call(o, 1, 2);
//call可以调用函数,也可以改变函数内的this指向
//call的主要作用可以实现继承
//apply方法
var p = {
name: 'aaa'
};
function nn(arr) {
console.log(this);
console.log(arr);
};
nn.apply(p, ['pink']);
//也是调用函数,可以改变内部指向
//但是它的参数必须是数组(伪数组)
var arr = [1, 66, 3, 99, 4, 999];
var max = Math.max.apply(Math, arr);
console.log(max);
//bind方法
var w = {
name: 'www'
};
function ww(a, b) {
console.log(this);
console.log(a + b);
};
var f = ww.bind(w, 1, 2);
f();
箭头函数this指向:
重点:箭头函数,不能改变this指向,只有普通function函数,能改变this指向
示例:
箭头函数不绑定this关键字,箭头函数中的this,指向的是函数定义位置的上下文this。
如果父级程序有this指向(父级程序也是函数),this指向的就是父级程序的this指向。
如果父级程序没有this指向(数组,对象...),this指向的就window。
例子: