编写CoffeeScript时,编译Javascript中不必要的return关键字



这段代码是咖啡脚本,当翻译成JS时,它给了我_load函数之前的"return"关键字。我试过移动函数,把循环变成一行代码似乎没有帮助请帮助

(->
  resourceCache = {}
  loading = []
  readyCallbacks = []
  # load image url or array of image urls
  load = (urlOrArr) ->
    if (urlOrArr instanceof Array)
      for url in urlOrArr
        _load(url)
    else
      _load(urlOrArr)
  _load = (url) ->
    if(resourceCache[url])
      resourceCache[url]
    else
      img = new Image()
      img.onload = ->
        resourceCache[url] = img
        if(isReady())
          (func) -> func() for el in readyCallbacks
      resourceCache[url] = false
      img.src = url
.
.
.


)()
这里是js
(function() {
    var load, loading, readyCallbacks, resourceCache, _load;
    resourceCache = {};
    loading = [];
    readyCallbacks = [];
    load = function(urlOrArr) {
      var url, _i, _len, _results;
      if (urlOrArr instanceof Array) {
        _results = [];
        for (_i = 0, _len = urlOrArr.length; _i < _len; _i++) {
          url = urlOrArr[_i];
          _results.push(_load(url));
        }
        return _results;
      } else {
        return _load(urlOrArr);
      }
    };
    return _load = function(url) {
      var img;
      if (resourceCache[url]) {
        return resourceCache[url];
      } else {
        img = new Image();
        img.onload = function() {
          resourceCache[url] = img;

在coffeescript "一切都是表达式(至少,尽可能地)"。函数的最后一个表达式是它的返回值。

为了强制执行,编译器会在函数的每个执行分支的末尾静默地添加隐式的return语句。

因此,JS中的return _load ...被期望为外部函数的最后一个语句是函数定义(_load = (url) -> ...)。


如果出于某种原因,您确实不希望返回内部函数,则必须在函数末尾添加额外的语句。请比较这些不同的情况:

1:隐式返回(你的情况)

->
    "Outer function"
    inner = ->
        "Inner function

编译成

(function() {
  (function() {
    "Outer function";
    var inner;
    return inner = function() {
      return "Inner function";
    };
  });
}).call(this);

2:带有显式返回语句

->
    "Outer function"
    inner = ->
        "Inner function"
    return

编译成

// Generated by CoffeeScript 1.7.1
(function() {
  (function() {
    "Outer function";
    var inner;
    inner = function() {
      return "Inner function";
    };
  });
}).call(this);

这个额外的返回语句实际上会使外部函数返回值undefined。如果您愿意,您可以通过使用return undefined甚至简单地使用undefined而不是单纯的return来显式地实现这一点。编译后的代码将略有不同(显式return void 0),但行为将是相同的。

3:显式undefined表达式

->
    "Outer function"
    inner = ->
        "Inner function"
    undefined
    # or `return undefined`

编译成

(function() {
  function() {
    "Outer function";
    var inner;
    inner = function() {
      return "Inner function";
    };
    return void 0;
  };
}).call(this);

最新更新