有人可以向我解释这在 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++ 等其他语言中看到过类似的东西
有人可以向我解释这在 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++ 等其他语言中看到过类似的东西
function(x, y) { }
是一个匿名函数。
(x, y)
调用该函数,传递x
和y
作为参数。
第二个代码块的目的是jQuery
提供 as $
(无需$
全局定义)并在本地范围内导入YAHOO
以使变量查找更快一些。
除此之外,它创建了一个新的范围,因此使用var
inside 定义的任何变量都不是全局的。
第一个代码块通常以这种方式用于创建新变量,例如,当您处于循环中并且需要创建具有当前i
值的变量以进行回调时:
for(var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() {
alert("number " + i);
}, 1000 * i);
})(i);
}
如果没有那个新的范围,您每次都会有相同的范围,因此会警告“数字 10”10 次。 i
第一个调用一个匿名函数,它接受 2 个参数并且不做任何事情,使用x
和y
作为参数。
第二个做同样的事情。它使用 $ 作为第一个参数名称,并将 jQuery 作为参数值传递。因此,可以在此函数内部使用$
来引用jQuery
对象。这是一种在函数内将变量别名为另一个名称的方法。
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 的匿名函数传递给此方法,该方法将对单次传递执行基准测试。漂亮,嗯?