《TypeScript图形渲染实战:2D架构设计与实现》 —3.2.4 回调函数的this指向问题

举报
华章计算机 发表于 2019/12/12 19:08:37 2019/12/12
【摘要】 本节书摘来自华章计算机《TypeScript图形渲染实战:2D架构设计与实现》 一书中第3章,第3.2.4节,作者是步磊峰。

3.2.4  回调函数的this指向问题

  如果仔细看,会发现在Application类中的start和step成员方法中,在调用request AnimationFrame时,其参数都是使用箭头函数的方式:requestAnimationFrame ( ( elapsed Msec : number ) : void => { } );而在3.1.3节中,调用requestAnimationFrame 函数时使用的是函数名作为参数:window . requestAnimationFrame ( step )。那么能否在Application类中的start和step方法中像3.1.3节的代码一样,使用函数名或方法名作为requestAnimation Frame方法的参数呢

  答案是:不能。下面修改一下start方法中的代码:

 

public start  ( ) : void {

    if ( ! this . _start ) {

        this . _start = true ;

        this . _requestId = -1 ;               // 将_requestId设置为-1

        // 在start和stop函数中,_lastTime和_startTime都设置为-1

        this . _lastTime = -1 ;

        this . _startTime = -1 ;

        // 启动更新渲染循环

           

        /* 注释掉箭头函数

        this . _requestId = requestAnimationFrame ( ( msec : number ) :

        void => {

            // 启动step方法

            this . step ( msec ) ;

        } ) ;

        */

          

        //注释掉上述代码,使用下面的代码来启动this . step方法

       this . _requestId = requestAnimationFrame ( this . step ) ;

    }

}

 

  然后如图3.6所示,在step成员方法体内第一行设置一个断点,按F5键启动调试后来看一下运行效果。

 image.png

图3.6  step方法中this指针为null值

  会看到,当运行到如图3.6所示的153行断点处,程序中断,此时将鼠标指针放在this关键字上,会显示this当前值为null值,这意味着如果代码继续往下运行(F10),程序肯定会报错,如图3.7所示。

 image.png

图3.7  Chrome浏览器报null值错误

  之所以报null值错误,是因为在编写step成员方法代码时,所有的this都是假设指向Application类的实例对象。但是将step成员方法作为参数传递给requestAnimationFrame方法时,step中的this实际上被绑定为null值了。为什么会这样呢?还是举个简单例子来更加详细地了解一下吧。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。