最近想深入学习一下js,现在先了解一下this的指向问题。以前学过点c#,对this稍微
有些了解,按我自己的理解(不一定准确)this应该是计算机在运作的过程中分配的内存绑定:
1. 函数的this指向
普通函数在全局中被调用,this是指向window的(非严格模式下,严格模式下是undefined)
{
let fn = function() {
console.log(this);
}
fn();//全局调用所以this的指向是undefined(严格模式)
}
普通函数在对象中去调用,this是指向调用对象的箭头函数在对象中this的指向:
{
let a = 123;
let obj = {
a: 12,
fn: function() {
console.log(this);
console.log(this.a);
}
};
obj.fn();//这里是对象调用this指向obj,this.a是12
}
首先我们先了解一下箭头函数关于this的基础知识
1.箭头函数作为函数的一种形式,对于this的处理和普通函数有所区别,它不会创建自己的this上下文,也就是说通过bind/call/apply函数方法设置this值时无效的,会被忽略;
2.因为箭头函数没有自己的this上下文,那么当它作为对象的方法函数运行时,this并不指向这个对象;
3.箭头函数的的函数体中出现的this在运行时绑定到最近的作用域上下文对象
4.你可以认为箭头函数的this和调用者无关,只和其定义时所在的上下文相关(箭头函数定义的时候就决定了上下文)
下面我们从代码来看一下:
//关于箭头函数的this
{
let a = 123;
let obj = {
a: 12,
fn: () => {
console.log(this);
console.log(this.a);
}
};
obj.fn();//这里this指向undefined
}
//箭头函数需要用普通函数包裹一层才能正确指向
{
let a = 123;
let obj = {
a: 12,
fn: function() {
let fn = () => {
console.log(this);
console.log(this.a);
}
fn();
}
}
obj.fn(); //this指向obj,this.a为12
}
//作为构造函数被调用指向被返回的实例对象
{
let a = 123;
function fn() {
this.a =12;
console.log(this);
//console.log(this.a);
}
let obj = new fn();
console.log(obj.a);//12
}
Function.prototype.call()和Function.prototype.apply()调用,能动态改变传入函数的this指向