当前位置:  开发笔记 > 编程语言 > 正文

功能或阶级之外的"超级"

如何解决《功能或阶级之外的"超级"》经验,为你挑选了1个好方法。

我无法透露这段代码:

class FooBar extends SomeParent {

  constructor() {
    super();
  }

  start() {
    var foo = function() {
      super.start();     // <-- Error: 'super' outside of function or class
    };
  } 
}  

抛出的错误是'super' outside of function or class.

但是,相同的代码在Babel REPL中变得很好.

我正在使用此命令使用自定义Node.JS程序进行转换:

babel.transformFileSync(filename,  { presets: [ 'es2015' ] } );

安装信息:

$ npm ls --global --depth 0
/usr/lib
??? babel@6.3.13
??? babel-core@6.3.17
??? babel-plugin-external-helpers-2@6.3.13
??? babel-plugin-syntax-async-functions@6.3.13
??? babel-plugin-transform-async-to-generator@6.3.13
??? babel-plugin-transform-regenerator@6.3.18
??? babel-plugin-transform-runtime@6.3.13
??? babel-polyfill@6.3.14
??? babel-preset-es2015@6.3.13
??? npm@1.4.28

$ node -v
v0.10.40

我究竟做错了什么?使用Babel 5进行转换时没有问题...



1> loganfsmyth..:

它在Babel REPL中有效,因为Babel 5没有对此进行检查.

这是无效的:

class Example extends Parent {
  start() {
    var foo = function() {
      super.start();
    };
  }
}

但使用箭头功能可以:

class Example extends Parent {
  start() {
    var foo = () => {
      super.start();
    };
  }
}

因为super行为是基于this其呼叫位置的环境.虽然箭头函数this与其父级共享其环境,但标准函数引入整体而非this环境.

特别:

    12.3.5.1电话MakeSuperPropertyReference()

    12.3.5.3调用GetThisEnvironment(),在第一种情况下将是函数表达式,在箭头情况下将是类方法,然后HasSuperBinding()在该环境中调用.

    8.1.1.3.3将false在第一种情况下返回,因为函数表达式没有while[[HomeObject]]类方法.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有