2

有人可以向我解释这在 javascript 中的作用吗?

 (function (x,y){}(x,y));

或这个

  // global import
  (function ($, YAHOO) {
         // now have access to globals jQuery (as $) and YAHOO in this code
  }(jQuery, YAHOO));

我从未在 java 或 c++ 等其他语言中看到过类似的东西

4

4 回答 4

3

function(x, y) { }是一个匿名函数。

(x, y)调用该函数,传递xy作为参数。

于 2012-07-01T21:39:08.197 回答
3

第二个代码块的目的是jQuery提供 as $(无需$全局定义)并在本地范围内导入YAHOO以使变量查找更快一些。

除此之外,它创建了一个新的范围,因此使用varinside 定义的任何变量都不是全局的。

第一个代码块通常以这种方式用于创建新变量,例如,当您处于循环中并且需要创建具有当前i值的变量以进行回调时:

for(var i = 0; i < 10; i++) {
    (function(i) {
        setTimeout(function() {
            alert("number " + i);
        }, 1000 * i);
    })(i);
}

如果没有那个新的范围,您每次都会有相同的范围,因此会警告“数字 10”10 次。 i

于 2012-07-01T21:40:58.123 回答
1

第一个调用一个匿名函数,它接受 2 个参数并且不做任何事情,使用xy作为参数。

第二个做同样的事情。它使用 $ 作为第一个参数名称,并将 jQuery 作为参数值传递。因此,可以在此函数内部使用$来引用jQuery对象。这是一种在函数内将变量别名为另一个名称的方法。

于 2012-07-01T21:42:00.953 回答
0

C# 有一个类似的概念,称为 Lambda 表达式。

public static Func<int> Foo()
{
    int a = 1,
        b = 2;

    return () => a + b;
}

它是一个匿名声明的通用的一流函数(通过一流函数,它意味着返回函数本身,而不是其结果)。

在这种情况下,我还将向您展示所谓的闭包 - 返回的方法包含“本地”变量 a 和 b,允许它们在 Foo 超出范围时持续存在。在许多语言中,匿名方法实现闭包。

匿名方法也很酷——你可以执行行为注入,就像在这个基准方法中一样:

public static TimeSpan BenchmarkMe(Action timeThis)
{
    Stopwatch sw = Stopwatch.StartNew()
    timeThis();
    sw.Stop;

    return sw.Elapsed;
}

您可以将返回 TimeSpan 的匿名函数传递给此方法,该方法将对单次传递执行基准测试。漂亮,嗯?

于 2012-07-10T18:12:11.727 回答