先说一声对不起,这篇文章本应该是昨天写的。(强行假装有很多人在等着看)

昨天聚众饮酒去了,喝醉了,可能喝了有两百多瓶吧。

有人就说啦,唉麒麟子,你怎么老爱吹牛*,动不动就两百多瓶,你真当自己是牛么。

大家不要急嘛,之所以说两百多瓶,就是想证明我昨晚确实喝醉了,醉得来都记不起喝了多少了。

还有什么能比这个不靠谱的数字更能说明问题的么?


一、function与this

const {ccclass, property} = cc._decorator;@ccclass
export default class NewClass extends cc.Component {// LIFE-CYCLE CALLBACKS:private _dontBBAnyMore:string = '不要再说了';start () {//方式一setTimeout(function(){console.log(this);this.dontBBAnyMore();}.bind(this),100);//方式二var self = this;setTimeout(function(){console.log(this);self.dontBBAnyMore();},100);//方式三setTimeout(this.dontBBAnyMore.bind(this),100);//方式四setTimeout( () => {console.log(this);this.dontBBAnyMore();},100);}dontBBAnyMore(){console.log(this);console.log(this._dontBBAnyMore);}
}

学过C++,JAVA, C#的人都知道,成员函数默认是有一个this驱动的。上面的代码中,我们演示了一个setTimeout回调,方式一和方式二中console.log(this);的打印值我们可以看到,this并不是我们的NewClass。而是Window(部分浏览器会是undefined),这是为什么呢。这要从函数说起。

我们可以简单认为,setTimeout在计时器触发的时候,会这样来使用我们传入的函数  callback();

这样的调用方式,会使用当前的this作为传参。

为了更深刻的理解这个问题,我们可以简单地向下面这样来理解。

1、骚气的Function是一个对象,对象有一个 _thisArg 属性

2、如果我们直接调用callback()这样的函数,它会使用他的 _thisArg 来替换我们代码中的 this ,如果 _thisArg 属性为空,在某些平台上,会以Window形式出现。在另一些平台上,直接就是undefined.

3、如果我们调用了callback.bind(this) 并把callback传递给其他调用者,那么相当于callback的 _thisArg 被提前赋值了,那么你调用callback();也会使用 _thisArg 来替换代码中的 this

回过头去看,你会发现,世界如此奇妙。


二、 () => {} 是什么

简单的理解就是 () => {} 这样的函数,他会帮你bind(this)
 
[随便找了一篇文章,大家可以看看]


三、为什么要self

说到这个时候,肯定就有人会说啦。既然bind这么屌,为什么还要self呢。

答案其实你们应该能猜到。 无非就两种。

1、这样写 TS上有自动提示

2、可读性好很多

3、我愿意

4、我看好多人也这样写的

这一段好像没什么好说的,说多了就跑题了。大家选一个能够说服自己的理由就行。


四、写在最后

今天虽然标题起得很屌,XXXX详解。

但实际上,这是一个老生常谈的基础问题。

小学三年级就应该会的。

然而这是社区出现最多的问题。

不写这个知识点吧,老有人问。

要真写了这个知识点吧,肯定又有人说,麒麟子就整这些没用的,忽悠小朋友。

反正嘴在你们身上,说什么都可以。你们爽就行。

散会,开饭!!!!

麒麟子Cocos Creator实用技巧十:function this self ()={}详解相关推荐

  1. 麒麟子Cocos Creator实用技巧

    麒麟子Cocos Creator实用技巧 大家好,我是麒麟子, 开源棋牌<幼麟棋牌-四川麻将>(泄漏版叫 <达达麻将>)作者,成都幼麟科技创始人. 自09年进入游戏行业以来,不 ...

  2. 麒麟子Cocos Creator实用技巧八:回合战棋类RPG战斗效果

    HELLO,大家好,我是麒麟子.作为Cocos社区高产用户,今天又给大家带来了一个看起来很酷,但实际上大多数人用不到的DEMO. 不知道大家是否记得梦幻西游.问道.英雄无敌.仙剑奇侠传.神仙道.神曲O ...

  3. 麒麟子Cocos Creator实用技巧六:游戏背景拖拽实现

    麒麟子做了一个DEMO给大家,这个DEMO很简单,大家可以按下鼠标,或者在手机上按住不放. 拖拽背景,背景会根据拖拽移动. 同时会保证背景边缘不会越过父节点的上下左右边界 在线演示:https://q ...

  4. 麒麟子Cocos Creator实用技巧七:方向与角度转换

    麒麟子做了一个Demo给大家,向大家演示了方向转角度,角度转方向的应用. Demo中有两个坦克,中间的坦克锁定了另一个坦克,始终把自己的炮口对准它,并且会不停地发朝另一个坦克发射炮弹. 发出来的炮弹会 ...

  5. 麒麟子Cocos Creator实用技巧一:如何正确地显示微信头像

    不管是游戏App,还是H5,又或者是微信小游戏.但凡接入了微信登录的应用,都可能需要显示微信头像. 在Cocos Creator中,我们常见的显示方法像下面这样 var headimg = 'http ...

  6. 麒麟子Cocos Creator实用技巧五:技能CD效果制作

    今天带给大家的是一个关于技能CD的效果制作. 此效果不仅可以用于技能CD,一些按钮的CD也是可以用的. 为了照顾大家迫不及待(猴急)的心情,我写了一个DEMO给大家.DEMO上面做了5个英雄的技能和一 ...

  7. 麒麟子Cocos Creator实用技巧二:微信名字截断(支持表情)

    在我们日常游戏开发中,经常会面临将玩家名字截断的需求. 假如玩家是在我们游戏中创建的名字,那么可以简单粗暴地禁止玩家使用手机表情输入即可. 但如果我们是第三方账号登录,且使用了第三方账号的用户昵称,那 ...

  8. 麒麟子Cocos Creator实用技巧四:打包原生App截图白屏解决方案

    大家在做棋牌App或者一些特定需求的时候,需要截取当前游戏屏幕内容保存. 我们一般是采用cc.RenderTexture来截图并保存到游戏的可写目录 有时候会遇上,截出来的图片是白屏,或者部分白屏. ...

  9. 麒麟子Cocos Creator 3D研究笔记十:【qfw】开源的Extension Pack for Cocos Creator 3D

    零.写在前面 愿你活得烈马青葱,不为他人的目光所累 ---嗯! 阿子也不知道这个句子的原始出处,但就想把它分享给大家.专心写好自己的BUG,让别人说去吧! 在进入今天的正文之前,阿子想给大家聊聊最近使 ...

最新文章

  1. NOIP2015神奇的幻方
  2. Introduction to pinatrace annotate version 2: a look into latches again
  3. 程序运行时堆区和栈区的分配
  4. markdown 转义字符
  5. cwyw不是有效的加载项_ADAS/AD开发09 - UDS与引导加载程序
  6. 智能续航兼得的“超能代表”OPPO Watch 2系列正式发布
  7. 一个站点存在多个web.config时如何管理?
  8. PHP生成条形码 之一 条形码介绍
  9. educoder答案pythonnumpy_Educoder 题解
  10. 双硬盘双win10互不干扰_win10系统安装双硬盘却无法显示另一个硬盘的修复方案...
  11. 解决OneNote同步出错
  12. 一个简洁美观的静态网页登陆页面(css+html)
  13. 网页html教学反思,教学反思怎么写
  14. CountDownLatch、CyclicBarrier实战场景分析(附代码)
  15. YOLO目标检测之IOU计算及其衍变体
  16. 5GNR RIV计算
  17. 电弧故障断路器全国产化电子元件推荐方案
  18. 《关于我们-合作》页面设计问题
  19. 西北师大计算机复试英语,西北师范英语语言文学英美文学复试
  20. 集训 08/12题解

热门文章

  1. 配置交换机的端口隔离功能
  2. 易方达积极成长证券投资基金2007年第3季度报告
  3. 2015-06-26
  4. r7000搭建php,netgear r7000 可搭建php服务器吗
  5. 一元多项式的加减 c语言链表实现
  6. 因为自家ChatGPT,谷歌「内讧」了
  7. 独立展馆 stand-alone pavilion
  8. 求二次、三次贝塞尔曲线的某个时间的位置及切线方向
  9. 新宝总结过年红包行情来了
  10. IDEA每次打开新项目Maven配置都会重置