this的指向及改变

this的指向

  1. 谁调用,指向谁 (指向当前调用的直接上级)
  2. 箭头函数的this指向调用它的上一级

改变this的指向 call,apply

call为fn提供了改变this的机会,此时的this也就是obj对象。

var name = "听风是风",
 obj = { name: 'echo' };
function fn() {
 console.log(this.name);
};//函数调用fn() //听风是风//函数应用fn.call(obj); //echo call为fn提供了改变this的机会,此时的this也就是obj对象。

call与apply的区别

call方法中接受的是一个参数列表,第一个参数指向this,其余的参数在函数执行时都会作为函数形参传入函数。

fn.call(this, arg1, arg2, ...);

而apply不同的地方是,除了第一个参数作为this指向外,其它参数都被包裹在一个数组中,在函数执行时同样会作为形参传入。

fn.apply(this, [arg1, arg2, ...]);

除此之外,两个方法的效果完全相同:

let o = { a: 1};
function fn(b, c) {
 console.log(this.a + b + c);
};
fn.call(o, 2, 3); // 6fn.apply(o, [2, 3]); //6

关于bind

call与apply在改变this的同时,就立刻执行,而bind绑定this后并不会立马执行,而是返回一个新的绑定函数。当执行绑定函数时,this指向与形参在bind方法执行时已经确定了,无法改变。

let o = { a: 1};
function fn(b, c) { 
console.log(this.a + b + c);
};
let fn1 = fn.bind(o, 2, 3);
fn1();//6

应用

我们都知道Math.max()方法能取到一组数字中的最大值,比如:

Math.max(1, 10); //10Math.min(1, 10); //1

那我们如何利用此方法求数组中最大最小呢,这里就可以利用apply的特性了:

Math.max.apply(null, [1, 2, 10]); //10
Math.min.apply(null, [1, 2, 10]); //1

在非严格模式下,当我们让this指向null,或者undefined时,this本质上会指向window,不过这里的null就是一个摆设,我们真正想处理的其实是后面的数组。

还记得在考虑兼容情况下怎么判断一个对象是不是数组吗?再或者是不是一个函数?利用Object.prototype.toString()结合call方法就能解决这个问题:

let a = [];let b = function () {};
Object.prototype.toString.call(a) === "[object Array]";//true
Object.prototype.toString.call(b) === "[object Function]//true

参考地址

posted @ 2023-03-20 22:05  张尊娟  阅读(7)  评论(0编辑  收藏  举报