网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月29日漏签0天
javascript吧 关注:269,218贴子:906,477
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 5回复贴,共1页
<<返回javascript吧
>0< 加载中...

请教下es6的this问题?奔溃ing

  • 只看楼主
  • 收藏

  • 回复
  • smiledoublen
  • null
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

有大佬能对以上的结果做一个分析解释么?
个人觉得所有结果应该都是22的。。。


  • 原来是禽兽灬
  • Number
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你会感到混乱是因为你把两个函数声明同时写出来,又同时调用了一些容易混淆的概念。
从头开始分析:
var a = 11;
这句话相当于 window.a = 11;
函数中的this是根据上下文改变的。
当函数作为构造函数时,this 指的就是实例对象。
当函数作为普通函数时,也要根据调用的上下文来判断,如果没有指定上下文引用,在浏览器中就指向window对象,在node中会指向global对象。
你在test函数中又声明了一个函数b,并且在test函数内部直接调用了函数b。
函数b并没有绑定上下文,他依然指向window。
所以第一个函数的结论是:
new test1()的时候,this.a指向的是实例对象,内部函数b指向的是window.a。所以是11;
test1()的时候,this.a由于没有指定上下文,指向了window.a。也就相当于将window.a改为22了。所以函数b打印出来的window.a是22。
至于箭头函数,他会找到声明该函数作用域的顶层作用域,同时上下文也会指向他。
说的稍微有点绕,慢慢理解。


2025-07-29 15:23:20
广告
不感兴趣
开通SVIP免广告
  • 原来是禽兽灬
  • Number
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
而且你第二个函数其实和箭头函数的关系不大。
当你直接调用函数test2时,他的this依然指向window。所以函数b的上下文虽然绑定在了test2上,但是由于test2的this指向window,所以函数b的this也依然指向window。


  • zxczxczxxc6
  • var
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
看你这段代码,把我都搞懵逼了,我想知道你为啥会写出这样的代码


  • zxczxczxxc6
  • var
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我明白了,不管是用new调用函数,还是直接调用函数,this都是指向了window,因为你test1函数中又创建了b函数,b函数是独立的,不是当前对象的方法,所以new test1(),调用后this.a指向了var a=11,可以理解为window.a=11,因为js中,全局变量就相当于window对象下的属性,所以new test1()执行结果是11,而此时函数内部this.a变成了对象下的属性,因为你通过new实例化了,就成为了一个对象,所以b函数执行后,this.a只能找到var a=11这个变量的值,找不到函数内的this.a,因为this.a已经变成了对象里的属性。
test1()直接调用的时候喃,b函数执行,this依然指向了window,但是此时你没有通过new调用,所以this.a先找到了var a=11,因为函数内this.a依然指向window.a,而var a=11可以看成是window.a=11,所以等于把a变量的值改写为22,所以执行结果变成了22.
下面的test2函数和test1函数不一样的地方是函数内的b函数变成了es6箭头函数,你要理解,箭头函数和普通函数区别,箭头函数中的this始终找的是它的上一层函数作用域中的this,所以当你new test2调用时,找到的就是this.a=22,this指的就是new出来的对象。
当你直接调用test2函数时,原理和上边其实是一样的,因为this都是指向的上一级函数中的this,找到的就是this.a=22,如果你把this.a=22这行代码去掉,那么它就是undefined,因为它的上一级函数中没有a的值


  • zxczxczxxc6
  • var
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
test1函数中的b函数是独立的,没有被其他对象或者dom元素所引用,内部this始终就是指向window,记住就好了,箭头函数this的指向始终是看它的上一层函数作用域中的this,如果没有上一层函数,就是window,其实我比较喜欢研究这些奇葩的js代码,比如闭包啊this指向啊,呵呵


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 5回复贴,共1页
<<返回javascript吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示