Javascript ES6消除了';这';关键字在课堂上无处不在
我现在正在使用Traceur来编写未来的javascript,这是我在某个类中拥有的一个函数Javascript ES6消除了';这';关键字在课堂上无处不在,javascript,ecmascript-6,traceur,Javascript,Ecmascript 6,Traceur,我现在正在使用Traceur来编写未来的javascript,这是我在某个类中拥有的一个函数 create() { this.game.physics.startSystem(Phaser.Physics.ARCADE); this.segmentcache = new SegmentCache(this.game); this.segments = new Segments(this.game); this.segments.cache = this.segm
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代码一样,它到处都覆盖着这个关键字。来自Java之类的语言,在引用类中的字段时,如果我不必指定,那么就必须指定它,这是非常不自然的
有没有办法让Traceur像Java一样解释类?(即未指定时自动插入此项等)。AFAIK,否
爪哇,C++,C++等。这是编译器的特性,不是执行。这意味着它是隐式完成的,编译器所做的是将正确的地址放入
中,并以正确的方式引用变量。大多数编译器中都有一条规则,即如果您有一个同名的局部变量(在局部范围内),则它具有成员变量的优先级
在javascript中,您可以通过调用
、应用
或绑定
轻松替换此
,并在作者不打算使用的对象上调用您的函数(即此
可能是具有不同结构的对象)。我认为这就是为什么语言语法要求您始终明确指定是引用scope还是this
javascript函数体中的更多内容实际上可以读取全局范围,因此如果不使用显式此,则定义窗口.member
(如果在浏览器中)可能会改变函数的行为。据我所知,ES6中没有此类功能
由于Javascript允许引用父作用域中的变量,这种类型的特性将变得复杂。因此,它必须以某种方式识别以下代码行:
ticks = 0;
意味着
this.ticks = 0;
或者它是否意味着以标记的名称引用当前或父范围中的变量
仅仅将属性添加到对象中,就会在属性引用和同名的局部变量或父范围变量之间产生冲突,从而打乱以前正常工作的代码。那可能会是一片混乱。现在,您必须命名局部变量的作用域,以避免与属性名称发生冲突。而且,如果您必须定义局部变量的范围,那么您只需重新引入一段您试图摆脱的额外语法
Java可以容忍这一点,因为编译器预先知道所有属性名,因此如果存在冲突,它可以报告错误。Javascript允许动态添加属性(在任何时候添加),因此解析器实际上不知道在解析时任何给定对象上会出现或不会出现什么属性名称,因此无法警告冲突。这只是语言解析/编译和工作方式的固有差异,因此在表达代码时会产生一些不同的功能或需求
可以使用带
结构的,以避免某些键入,但是出于详细的原因(而非增强的原因),正在从Javascript中删除带
的(在严格模式下不允许),因此,这不是一种推荐的方法。如果您想避免在构造函数中分配实例变量(实际上是在任何地方)时键入this
,可以使用.extend()
作为一个简单的示例,您可以对类进行预处理,以插入此属性。
用于预定义的属性名称集,例如,通过每个类的自定义静态元配置,该配置可用于gulp
生成文件
DEBUG ClassPreprocessor: buildSync [ 'logger',
'context',
'config',
'startedComponents',
'components',
'requiredComponents' ]
regex ([^a-z\.'])(logger|context|config|startedComponents|components|requiredComponents)([^a-z:'])
replaceWith $1this.$2$3
其中,根据指定的prop名称,现在我正在构造一个正则表达式来预处理该类。但这是非常脆弱的,因为它不是基于令牌的。稍后,我想通过AST上的Babel transformer尝试类似的东西。这将不再是有效的JavaScript。Traceur没有定义新的语言,它坚持ES6规范。我认为您没有正确地理解这一点。如果您想编写JavaScript,那么就不要这样做,也不要试图将其视为Java(因为它与Java非常不同)。对我来说,情况正好相反:我发现不必在Java中指定这个非常令人困惑。我发现这种“含蓄性”使遵循代码变得更加困难。function(){with(this){…}
;)@杰里米·班克斯——我差点错过了比赛的最后一刻。更严重的是:这可能不可能在像JavaScript这样动态的语言中有效地实现。也许可以在提议的“SoundScript”子集中实现,但这是ES6之外的几个步骤。也许有一天。我不相信这是个好主意。如果您想编写Java,请编写Java。也许可以把它编译成Javascript。但是不要强迫语言成为它不是的东西。
DEBUG ClassPreprocessor: buildSync [ 'logger',
'context',
'config',
'startedComponents',
'components',
'requiredComponents' ]
regex ([^a-z\.'])(logger|context|config|startedComponents|components|requiredComponents)([^a-z:'])
replaceWith $1this.$2$3