【问题标题】:Global import in javascriptjavascript中的全局导入
【发布时间】:2012-07-02 09:40:24
【问题描述】:
有人可以向我解释一下这在 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
design-patterns
closures
globals
【解决方案1】:
function(x, y) { } 是一个匿名函数。
(x, y) 调用该函数,将x 和y 作为参数传递。
【解决方案2】:
第二个代码块的目的是使jQuery 可用作$(不全局定义$)并在本地范围内导入YAHOO 以加快变量查找速度。
除此之外,它还创建了一个新范围,因此在内部使用var 定义的任何变量都不是全局变量。
第一个代码块通常以这种方式用于创建新变量,例如当您处于循环中并且需要使用当前的i 值创建一个用于回调的变量时:
for(var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() {
alert("number " + i);
}, 1000 * i);
})(i);
}
如果没有那个新范围,您每次都会有 相同 i 并因此警告“第 10 号”10 次。
【解决方案3】:
第一个调用匿名函数,它接受 2 个参数并且不执行任何操作,以 x 和 y 作为参数。
第二个做同样的事情。它使用 $ 作为第一个参数名称,并将 jQuery 作为参数值传递。因此,可以在此函数内部使用$ 来引用jQuery 对象。这是一种在函数中将变量别名为另一个名称的方法。
【解决方案4】:
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 的匿名函数传递给此方法,该方法将针对它执行单次通过的基准测试。漂亮,嗯?