this基础总结

1.简介
this在面向对象中指的当前对象对的一个引用。但在js中this不是固定不变的,会根据执行环境的改变而变化。在绝大多数情况下,函数的调用方式决定了this的值(运行时绑定)。
在函数中this表示全局对象window,指向window;
在单独使用时表示全局对象;
在方法调用中,this指向调用该方法的对象(如果存在多级调用指向方法的上一级对象)
在函数的严格模式下(use strict)this为undefined;
在事件中,this指向接受事件的元素;
call()、apply()、bind()方法可以更改this指向;
this最终指向的是调用它的对象;
ES5引入bind()方法改变this的指向,返回一个新函数供用户随时调用;
ES5引入箭头函数–不提供自身的this绑定,this为闭合词法上下文的值;
2.在函数中this表示全局对象window
function a(){
var user = “追梦子”;
console.log(this.user); //undefined
console.log(this); //Window
}
a();
注:在该函数中a()其实等于window.a(),所以this指向的是调用函数的对象window
function a(){
var user = “追梦子”;
console.log(this.user); //undefined
console.log(this);  //Window
}
window.a();
3.在函数调用中this指向调用该方法的对象(如果存在多级调用指向方法的上一级对象)
var o = {
user:“追梦子”,
fn:function(){
console.log(this.user); //追梦子
}
}
o.fn();
该函数中this指向的是调用方法fn的对象o.
this的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁
eg1:
var o = {
user:“追梦子”,
fn:function(){
console.log(this.user); //追梦子
}
}
window.o.fn();
这段代码和上面的那段代码几乎是一样的,但是这里的this为什么不是指向window,如果按照上面的理论,最终this指向的是调用它的对象。window是js中的全局对象,我们创建的变量实际上是给window添加属性,所以这里可以用window点o对象。再看一段代码eg2:
var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); //12
}
}
}
o.b.fn();
情况1:
如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window。在js的严格版中this指向的不是window,是undefined
情况2:
如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。
情况3:
如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象。例子eg3如下:
var o = {
a:10,
b:{
// a:12,
fn:function(){
console.log(this.a); //undefined
}
}
}
o.b.fn();
尽管对象b中没有属性a,这个this指向的也是对象b,因为this只会指向它的上一级对象,不管这个对象中有没有this要的东西。
还有一种比较特殊的情况eg4:
var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); //undefined
console.log(this); //window
}
}
}
var j = o.b.fn;
j();
这里this指向的是window。this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的,例子4中虽然函数fn是被对象b所引用,但是在将fn赋值给变量j的时候并没有执行所以最终指向的是window,这和例子3是不一样的,例子3是直接执行了fn。
3.构造函数版this
function Fn(){
this.user = “追梦子”;
}
var a = new Fn();
console.log(a.user); //追梦子
这里之所以对象a可以点出函数Fn里面的user是因为new关键字可以改变this的指向,将这个this指向对象a,为什么我说a是对象,因为用了new关键字就是创建一个对象实例,理解这句话可以想想我们的例子3,我们这里用变量a创建了一个Fn的实例(相当于复制了一份Fn到对象a里面),此时仅仅只是创建,并没有执行,而调用这个函数Fn的是对象a,那么this指向的自然是对象a,那么为什么对象a中会有user,因为你已经复制了一份Fn函数到对象a中,用了new关键字就等同于复制了一份。
4.this碰到return时
eg1:
function fn()
{
this.user = ‘追梦子’;
return {};
}
var a = new fn;
console.log(a.user); //undefined
eg2:
function fn()
{
this.user = ‘追梦子’;
return 1;
}
var a = new fn;
console.log(a.user); //追梦子
eg3:
function fn()
{
this.user = ‘追梦子’;
return undefined;
}
var a = new fn;
console.log(a.user); //追梦子
如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。
function fn()
{
this.user = ‘追梦子’;
return undefined;
}
var a = new fn;
console.log(a); //fn {user: “追梦子”}
还有一点就是虽然null也是对象,但是在这里this还是指向那个函数的实例,因为null比较特殊
function fn()
{
this.user = ‘追梦子’;
return null;
}
var a = new fn;
console.log(a.user); //追梦子
5.严格模式下的this
非严格模式:
this 的值不是由该调用设置的,所以 this 的值默认指向全局对象,浏览器中就是 window。
function f1(){
return this;
}
//在浏览器中:
f1() === window; //在浏览器中,全局对象是window

//在Node中:
f1() === globalThis;

严格模式:
function f2(){
“use strict”; // 这里是严格模式
return this;
}
f2() === undefined; // true
注:
无论是否在严格模式下,在全局执行环境中(在任何函数体外部)this 都指向全局对象。
可以使用 globalThis 获取全局对象,无论你的代码是否在当前上下文运行。
在函数内部,this的值取决于函数被调用的方式
6.类上下文
在类的构造函数中,this 是一个常规对象。类中所有非静态的方法都会被添加到 this 的原型中 :
class Example {
constructor() {
const proto = Object.getPrototypeOf(this);
console.log(Object.getOwnPropertyNames(proto));
}
first(){}
second(){}
static third(){}
}
new Example(); // [‘constructor’, ‘first’, ‘second’]
静态方法不是 this 的属性,它们只是类自身的属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值