15

我一直在寻找一个在 JavaScript 中使用 lambda 函数或匿名函数的好例子,但没有成功。

jQuery 是否也有实现 lambda 的内置函数?

4

2 回答 2

23

JavaScript中,这些被称为函数表达式function用作运算符而不是声明function用作语句),可以命名或匿名。

这真的很简单,就像做一些事情告诉编译器它是一个表达式(例如var x =)然后正常编写一个函数,并;在最后添加一个分隔符。

function invoke(lam) {
    console.log(
        lam()
    );
}

var lambda = function () {return 'foo';};

invoke(lambda); // "foo" logged

JavaScript中的任何函数一样,作用域是从定义它的地方继承的,而不是从它被调用的地方继承的。

自调用和匿名函数几乎总是函数表达式。对于自调用函数,(beforefunction意味着代码被解释为表达式,然后 (preferred)());或 (alternate))();立即调用它。

您可能需要记住,函数表达式本身不会被提升。如果您需要提升它以避免引用错误,请结合var. 在代码通过定义它的行之前,函数本身仍然不能完全可用。

对于命名函数表达式,该名称仅在函数内部可用,而在外部不可用(尽管某些旧版本的 IE 泄露了该名称)。为了描述这一点,我将使用两个示例,一个 self invoking 和一个vard;

// self-invoked
(function foo() {
    console.log('inside:', foo); // foo is defined here
}());
console.log('outside:', foo); // ReferenceError: foo is not defined

// var
var bar = function foobar() {
    console.log('inside:', foobar); // foobar is defined here
    console.log('inside:', bar); // bar is defined here too (=== foobar)
};
bar(); // invoke
console.log('outside:', bar); // bar is also defined here, but..
console.log('outside:', foobar); // ReferenceError: foobar is not defined
于 2013-06-17T01:54:40.477 回答
16

lambda 函数(匿名函数)实际上只是一个没有名称的函数声明(它可以稍后分配给一个变量,并且在技术上仍然是一个 lambda)。一个常见的例子是自执行函数:

(function(){
  /*
    do stuff
  */
})();

另一个常见示例是将函数作为参数传递给 AJAX 或 JSONP 回调、超时或sort()

setTimeout(
    function() {
        console.log('lambda!');
    },
    100
);

在 lambda 的“接收”端,您可以像调用任何其他函数一样调用函数参数:

functionThatUsesLamba(function(s) { console.log(s); });

function functionThatUsesLambda(logFn) {
  if (typeof(logFn) == 'function') {
    logFn('lambda');
  } else {
    throw "logFn must be a function!!!";
  }
}
于 2013-06-17T02:01:04.740 回答