this的指向及改变
this的指向
- 谁调用,指向谁 (指向当前调用的直接上级)
- 箭头函数的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
本文作者:张尊娟
本文链接:https://www.cnblogs.com/wszzj/p/17238103.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步