Javascript ES6 消除了类中各处对 'this' 关键字的使用

标签 javascript ecmascript-6 traceur

我正在使用 Traceur 来编写一些 future 的 javascript,这是我在某些类(class)中拥有的功能

create() {
    this.game.physics.startSystem(Phaser.Physics.ARCADE);

    this.segmentcache = new SegmentCache(this.game);
    this.segments = new Segments(this.game);
    this.segments.cache = this.segmentcache;
    this.segments.seek(3);

    this.guy = new Guy(this.game, 140 + 8, 80);
    this.guy.anchor.set(0.5, 1.0);
    this.game.add.existing(this.guy);

    this.game.camera.x = 100;
    this.ticks = 0;
    this.cross = 0;
}

当然,与任何传统的 javascript 代码一样,它到处都覆盖着 this 关键字。来自 Java 等,当我不需要指定时,在类中引用字段时必须指定它是非常不自然的。

有没有办法让 Traceur 以与 Java 相同的方式解释类? (即未指定时自动插入,等等)

最佳答案

据我所知,没有。

在 Java、C#、C++ 等中,这是编译器的一个特性,而不是执行。这意味着它是隐式完成的,编译器所做的是将正确的地址放入 this 并以正确的方式引用变量。大多数编译器都有一个规则,如果你有一个同名的局部变量(在局部范围内),它优先于成员变量。

虽然在 javascript 中,您可以通过 callapplybind 轻松替换 this 并让您的函数成为调用 over 作者不打算使用的对象(即 this 可能是具有不同结构的对象)。我认为这就是为什么语言语法要求您始终明确指定您是指范围还是 this 的原因。

more in javascript function body 实际上可以读取全局作用域,所以定义 window.member(如果在浏览器中)可能会改变你函数的行为,如果你不使用明确的 this

关于Javascript ES6 消除了类中各处对 'this' 关键字的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29157557/

相关文章:

javascript - 类型 'mergeMap' 上不存在属性 'Observable<any>'

javascript - Angular 在我不想要的 .js 文件请求中添加一个随机数

javascript - Promise 覆盖导致 then 调用出错

javascript - 如何在 Javascript/Lodash/ES6 中搜索父对象和子对象?

javascript - ES6 + SystemJs - 为什么我必须使用 .js 扩展名来导入 es6 模块?

javascript - 将 <form>、<div> 或 <p> 数据复制到剪贴板

javascript - ReactJS 显示/隐藏带按钮的 div

Javascript - 我应该在需要特定接口(interface)的地方使用继承模型吗?

javascript - React 和 ES6 继承

javascript - 动态 ES6 模块作用域