我无法透露这段代码:
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进行转换时没有问题...
它在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]]
类方法.