我写了一个函数,它报告了一些元素被加载:
var reportLoaded = function(element) {
$("<div>" + element + " loaded " + new Date().getMilliseconds()
+ "</div>").appendTo("body");
}
但是当我将此函数附加到例如jQuery的ready
方法时:
$(document).ready(reportLoaded("document"))
它不起作用,因为函数是直接评估的。
所以我必须做这样的事情:
var reportLoadedDelayed = function(element) {
return function() {
reportLoaded(element);
}
}
$(document).ready(reportLoadedDelayed("document"))
是否有一个简短的表示法来指定您希望按名称评估参数?像在Scala中一样,您可以声明一个函数:
def lazyEval(x: => Int) = {println("lazy"); x;}
并且x将在实际需要时进行评估(如果有的话)。
答案 0 :(得分:2)
但是当我将这个函数附加到例如jQuery的ready方法时:
$(document).ready(reportLoaded("document"))
没有将其附加到ready
。它调用 reportLoaded("document")
并将其返回值传递给ready
,与foo(bar())
调用 {的方式完全相同{1}}并将其返回值传递给bar
。
如果要实际传递函数引用,请使用函数表达式或Function#bind
,它可以用于curry参数:
foo
或
$(document).ready(function() {
reportLoaded("document");
});
或实际上,jQuery有$.proxy
:
$(document).ready(reportLoaded.bind(null, "document"));
如果你这么做了,你可以通过给自己一个$(document).ready($.proxy(reportLoaded, null, "document"));
函数来摆脱null
的需要:
curry
请注意// Best to have this in a scoping function
var slice = Array.prototype.slice;
Function.prototype.curry = function() {
var args = slice.call(arguments, 0);
args.unshift(null);
return this.bind.apply(this, args);
};
是&#34;新&#34;在ES5(2009)中,如果您需要支持IE8等旧版浏览器,可以轻松填充。
答案 1 :(得分:0)
在Javascript中没有lambda表达式,最接近的是函数表达式:
$(document).ready(function(){ reportLoaded("document"); });
您还可以使用proxy
method从函数标识符创建函数,并将参数绑定到该函数:
$(document).ready($.proxy(reportLoaded, this, "document"));