CoffeeScript可以翻译成这片JavaScript吗?

时间:2012-03-20 10:17:06

标签: javascript coffeescript

function abc() {
    var a = 1;
    var func = function() {
        var a = 2;
    }
    func();
    alert(a);
}

注意var,在代码段中,a的结果将为1,但如果省略var,结果将为2,但我发现咖啡无法转化为此。

例如以下内容:

abc = ->
    a = 1
    func = ->
        a = 2
        return
    func()
    alert(a)
    return

5 个答案:

答案 0 :(得分:5)

CoffeeScript docs(强调添加):

  

因为您无法直接访问var关键字,所以就是   不可能故意遮蔽外部变量,你可能只会参考   它。

是否有理由需要隐藏a并且不能只使用不同的标识符?

答案 1 :(得分:4)

您可以使用反引号来执行普通的js。

abc = ->
    a = 1
    func = ->
        `var a = 2`
        return
    func()
    alert(a)
    return

编译表格

var abc;

abc = function() {
  var a, func;
  a = 1;
  func = function() {
    var a = 2;
  };
  func();
  alert(a);
};

答案 2 :(得分:2)

CoffeeScript,根据设计,不允许您隐藏先前声明的变量。然而,有一种情况仍然存在:

abc = ->
    a = 1
    func = (a) ->
        a = 2
        return
    func()
    alert(a)
    return

这将导致1。因为a是函数参数,所以它是函数作用域的本地函数。

顺便说一下,您可以将其重写为

abc = ->
    a = 1
    do (a) -> a = 2
    alert a
    return

其中do (a) -> a = 2相当于((a) -> a = 2)()

答案 3 :(得分:1)

好吧,如果你这样做:

abc = ->
    a = 1
    func = ->
        b = 2
        alert(b)
        return
    func()
    alert(a)
    return

你得到:

var abc;

abc = function() {
  var a, func;
  a = 1;
  func = function() {
    var b;
    b = 2;
    alert(b);
  };
  func();
  alert(a);
};

所以只是不要在第二个方法范围内使用相同的变量名,你就可以了。

答案 4 :(得分:0)

以下代码怎么样?

abc = ->
    a = 1
    func = ->
        @a = 2
        return
    func()
    alert(a)
    return

我同意:这不是严格相同的代码,但行为符合预期......

你的问题只是一种风格构成,还是你有“现实世界”的问题?