【问题标题】: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) 调用该函数,将xy 作为参数传递。

    【讨论】:

      【解决方案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 个参数并且不执行任何操作,以 xy 作为参数。

        第二个做同样的事情。它使用 $ 作为第一个参数名称,并将 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 的匿名函数传递给此方法,该方法将针对它执行单次通过的基准测试。漂亮,嗯?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-04-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多