CoffeeScript 可以翻译成这段 JavaScript 吗?

Can CoffeeScript Be Translated into This Piece of JavaScript?

本文关键字:JavaScript 翻译 CoffeeScript      更新时间:2023-09-26
function abc() {
    var a = 1;
    var func = function() {
        var a = 2;
    }
    func();
    alert(a);
}

注意var,在这段代码中,a的结果将是1,但如果省略var,结果将是2,但我发现Coffee无法翻译成这个。

例如:

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

来自 CoffeeScript 文档(着重号已添加(:

因为您不能直接访问 var 关键字,所以它是 不可能故意隐藏外部变量,只能参考 到它。

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

您可以使用反引号来执行普通的 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);
};

根据设计,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)()

好吧,如果你这样做:

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);
};

因此,不要在第二个方法范围内使用相同的变量名,一切就绪。

下面的代码呢?

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

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

您的问题只是文体组合还是您有"现实世界"问题?