为什么coffeescript在构造函数参数前面加上“1”

时间:2015-10-21 16:45:20

标签: coffeescript

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

1 个答案:

答案 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