JavaScript:按名称调用参数评估

时间:2015-01-25 12:52:58

标签: javascript

我写了一个函数,它报告了一些元素被加载:

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将在实际需要时进行评估(如果有的话)。

2 个答案:

答案 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"));