es6箭头函数--基础的this指向

箭头函数和普通函数的区别如下:
普通函数:谁调用我,我的this就指向谁。
箭头函数:我定义在哪个位置,this就指向谁。

总结:
普通函数中的this:
1.this总是代表它的直接调用者, 例如 obj.func ,那么func中的this就是obj
2.在默认情况,没找到直接调用者,则this指的是 window,常见的window的属性和方法有: alert, location,document,parseInt,setTimeout,setInterval等。
3.使用call,apply,bind(ES5新增)绑定的,this指的是绑定的对象。
4.全局作用域下,用var和function声明定义并调用的变量this都指向window。

示例:

let a = 'zs';
let aa = setTimeout(function () {
    console.log(this)//window
    console.log(this.a)//undefined
}, 1000);

分析:回调函数的this都指向window,let声明的变量不指向window

1.第一组比较:

普通函数:

var age = 100;
var obj = {
    age: 20,
    say: function () {
        console.log(this.age)//20
    }
}
obj.say()

结果显示:20
分析:普通函数,谁调用函数,函数的this就指向谁,这里obj调用say(),所以this指向obj,那obj.age=20,所以打印结果为20。

箭头函数:

var age = 100;
var obj = {
    age: 20,
    say: () => {
        console.log(this.age)//指向window
    }
}
obj.say()

结果显示:100
分析:箭头函数,函数的this指向该函数被定义时的位置,function定义时this指向window,第一行用var声明且赋值的变量也指向window,那window.age=100,所以打印结果为100。

2.第二组比较:

普通函数+call:

const obj = { name: '张三' }
function fn() {
    console.log(this);//{ name: '张三' }
    return function () {
        console.log(this);//window,普通函数this指向调用的位置
    }
}
const resFn = fn.call(obj);
resFn();

结果显示:两次打印的this都指向window这个对象。
分析:这次的第8行,fn函数的this指向由window变为了obj,所以第3行输出了{ name: '张三' },函数继续执行,我们看到常量resFn承接了fn函数返回的一个函数声明,第9行调用了这个函数,这是一个普通函数,那它的this指向的是它调用的位置,此时resFn在全局作用域下被调用,那么这个函数的this应该指向window

箭头函数:

const obj = { name: '张三' }
function fn() {
    console.log(this);//window
    return () => {
        console.log(this);//window
    }
}
const resFn = fn();
resFn();

结果显示:第一次打印的this都指向obj这个对象,第二次this指向window
分析:这次的第8行,fn函数没有执行call()函数,那由于fn是在全局作用域下定义的函数,此时的function,this指向window,所以第2行,输出为window。第9行调用了这个函数,由于该函数是箭头函数,它的this指向的是函数定义时的那个this的指向,这个函数定义在fn里面,fn的this指向window,所以这个箭头函数也指向window

箭头函数+call():

const obj = { name: '张三' }
function fn() {
    console.log(this);//{ name: '张三' }
    return () => {
        console.log(this);//{ name: '张三' }
    }
}
const resFn = fn.call(obj);//改变了fn的this指向,指向obj这个对象
resFn();

结果显示:两次打印的this都指向obj这个对象,输出结果都是{ name: '张三' }
分析:第8行表明,fn函数的this指向由window变为了obj,所以第3行输出了{ name: '张三' },函数继续执行,我们看到常量resFn承接了fn函数返回的一个函数声明,第9行调用了这个函数,由于该函数是箭头函数,它的this指向的是函数定义时的那个this的指向,这个函数定义在fn里面,fn的this指向obj,所以这个箭头函数也指向obj

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值