这段代码是咖啡脚本,当翻译成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);