前端提高篇(十六)JS进阶12函数this指针

本文详细解释了JavaScript中函数的this指向规则,包括在不同上下文中的行为,如外部函数、内部函数以及对象属性函数。同时讨论了内存管理中函数作为对象的特性,以及new关键字创建的新对象如何影响this的指向。
摘要由CSDN通过智能技术生成

console.log(‘e2:’,this.x);

}

e2();

}

f();

f.e();

e2函数输出为10,即e2函数的this是window,e2函数虽然在f函数的作用域内,但属于window对象;

而其中的匿名函数,是f的一个属性,this指向的是f,输出为1000

在这里插入图片描述

var x = 10;

function f(){

f.x = 1000;

f.e = function(){

console.log(this.x);

}

function e2(){

console.log(‘e2:’, this);

}

e2();

}

f();

f.e();

在这里插入图片描述

一个函数可以被多个对象拥有,但使用函数时,this依然是那个对象

var name = ‘win’;

function f(){

console.log(this.name);

}

var obj1 = {

name:‘obj1’,

f:f,//把f函数的指针赋值给obj1的属性f

}

var obj2 = {

name:‘obj2’,

f:f,

}

f();//相当于window.f();指向window

obj1.f();//this指向obj1

obj2.f();//this指向obj2

运行效果:符合“谁拥有这个函数,this就是谁”的定义,每个对象使用这个函数时,this指针指向自己,输出的name也就是自己的name

在这里插入图片描述

内存管理方面:

函数是特殊对象,在存储时,是将地址存在栈中,将对象内容存在堆中,并有一个指针做栈与堆的链接,链接地址与对象

当多个对象都有相同的函数时,存储的是这个函数的地址,

在这里插入图片描述

当对象存储的是函数执行后得到的结果,如果函数没有return,得到的是undefined

var name = ‘win’;

function f(){

console.log(this.name);

}

var obj1 = {

name:‘obj1’,

f:f(),//这里执行了一次f函数,是window的f,会输出’win’,但obj1.f为undefined

}

var obj2 = {

name:‘obj2’,

f:f,

}

console.log(‘obj1.f:’+obj1.f);

// f();

// obj1.f();

// obj2.f();

在这里插入图片描述

如果有return值,并且return了函数本身,跟之前的情况就一样了

var name = ‘win’;

function f(){

console.log(this.name);

return f;

}

var obj1 = {

name:‘obj1’,

f:f(),//此时obj1又拥有了f函数

}

var obj2 = {

name:‘obj2’,

f:f,

}

console.log(‘obj1.f:’+obj1.f);

// f();

obj1.f();

// obj2.f();

在这里插入图片描述

第一个’win’是obj1执行了一次f()函数而打印的,最后的obj1是执行了obj1的f属性,即obj1.f();

练习:

函数类使用函数,this指向具体的对象,依然是看哪个对象拥有了这个使用了this指针的函数

1.定义了一个函数A,并且嵌套了函数B:

function f(){

console.log(‘this1:’,this);

this.name = ‘ccy’;//修改了全局变量中的name

this.e = function(){

console.log(this.name);//输出"ccy"

console.log(‘this2:’,this);

}

}

var name = ‘yyy’;

f();

e();

f函数里的this.name和this.e中的this指的是window,

匿名函数里的this.name指的也是window,这个匿名函数,是window对象中e属性的值

也就是,这段代码中的三个this,都指的同一个对象:window

因此运行效果是:

在这里插入图片描述

2.函数类

function f(){

console.log(‘this1:’,this);//这里的this,指的是新new出来的对象cc

this.name = ‘ccy’;

this.e = function(){

console.log(‘this.name’,this.name);

console.log(‘this2:’,this);//拥有这个匿名函数的是新对象cc,this指针也指向cc

}

}

var name = ‘yyy’;

var cc = new f();

最后

基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值