class MyController
constructor: (@foo) ->
转换为(这很好)
var MyController;
MyController = (function() {
function MyController(foo) {
this.foo = foo;
}
return MyController;
})();
但是以下代码
class MyController
constructor: (@foo) ->
@bar = foo
转换为
var MyController;
MyController = (function() {
function MyController(foo1) { //foo1 ??
this.foo = foo1;
this.bar = foo; //Now due to this, the compiler throws up!
}
return MyController;
})();
虽然我期待以下转换
var MyController;
MyController = (function() {
function MyController(foo) {
this.foo = foo;
this.bar = foo;
}
return MyController;
})();
这是编译中的错误还是我错过了什么?
这是link
答案 0 :(得分:1)
这里的CS编译器没有任何问题,唯一的问题是你的第二个例子不正确。
让我们仔细看看您的代码:
class MyController
constructor: (@foo) ->
@bar = foo
首先,您将@foo
分配给第一个参数,这很好。
但是,您已将@bar
分配给某个全局foo
变量,该变量未在您的代码中的任何位置定义。
CS将foo
重命名为foo1
,以避免命名与全局foo
变量的冲突。
可能你想要这样的东西:
class MyController
constructor: (@foo) ->
@bar = @foo
<强>更新强>
(@foo) ->
是用于将第一个参数值赋给this.foo
的语法糖。当然,CS使用临时变量来进行这个赋值,尽管唯一保证这个临时变量名称的是它不会与你自己的任何变量发生冲突。
至于你的第一个例子,下面的代码应解释为什么CS在那里表现正确:
foo = 42
class MyController
constructor: (@foo) ->
@bar = foo