-2

生成以下 JavaScript 的确切 CofeeScript 是什么:

var AddArtist= function() {
      var addDiv, artistVal;
      addDiv = $("#artistname");
      artistVal = $("#artistinput").val();
      $(" <div id=\"artistname2\"><label>" + artistVal + "</label> /div>").appendTo(addDiv);
      return false;
    };

我尝试使用http://js2coffee.org/将其转换为 Cofee

产生:

AddArtist = ->
  addDiv = undefined
  artistVal = undefined
  addDiv = $("#artistname")
  artistVal = $("#artistinput").val()
  $(" <div id=\"artistname2\"><label>" + artistVal + "</label> /div>").appendTo addDiv
  false

当我将其粘贴到使用 CofeeScript 插件的 Visual Studios 中时,输出为:

(function() {
  var AddArtist;

  AddArtist = function() {
    var addDiv, artistVal;
    addDiv = $("#artistname");
    artistVal = $("#artistinput").val();
    $(" <div id=\"artistname2\"><label>" + artistVal + "</label> /div>").appendTo(addDiv);
    return false;
  };

}).call(this);

因此 CoffeeScript 插件将脚本包装到另一个函数中,因此 AddArtist 变量永远不会离开内部函数的范围。

这导致我的网页上出现“未捕获的引用错误 AddArtist”。

问题是使用 Visual Studios 插件,生成以下 JavaScript 的确切 cofee 脚本是什么?

var AddArtist= function() {
      var addDiv, artistVal;
      addDiv = $("#artistname");
      artistVal = $("#artistinput").val();
      $(" <div id=\"artistname2\"><label>" + artistVal + "</label> /div>").appendTo(addDiv);
      return false;
    };
4

1 回答 1

0

CoffeeScript 会将生成的 JavaScript 包装在一个函数包装器中,以防止意外泄漏到全局范围内,除非您使用以下代码进行编译--bare

-b, --bare
在没有顶级函数安全包装器的情况下编译 JavaScript。

如果你想AddArtist在全局范围内,你必须明确地把它放在那里:

@AddArtist = ->
  addDiv = $("#artistname")
  artistVal = $("#artistinput").val()
  $("<div id='artistname2'><label>#{artistVal}</label></div>").appendTo addDiv
  false

或者:

window.AddArtist = -> ...

如果您只担心浏览器环境。我还清理了 js2coffee 对您的代码所做的其他一些事情。

js2coffee 还有一些其他的错误,所以我建议你要么将工作的 JavaScript 保留为 JavaScript,要么学习 CoffeeScript 并手动进行转换。CoffeeScript 最终以 JavaScript 结束,因此无需转换工作代码。如果您手动进行转换,您最终会更好地理解 CoffeeScript,并且您将拥有更多惯用的 CoffeeScript 代码,因为您将翻译意图和功能而不仅仅是标记。

于 2013-08-24T00:36:45.810 回答