JavaScript / JQuery =奇怪的函数定义,从未见过的语法?

时间:2010-01-06 08:46:52

标签: javascript jquery

下面是JQueryTools的一个函数,我之前从未见过以下定义,也不了解它的用途:

(function (b) { ....})(jQuery);

为什么round()围绕函数定义,为什么(jQuery)写在它后面?这到底是做什么的。从我的角度来看(jQuery)根本没有任何功能吗?我在哪里可以了解有关此语法和目的的更多信息?

非常感谢。

(function(b) {
 b.fn.wheel = function(e) {
  return this[e ? "bind" : "trigger"]("wheel", e)
 };
 b.event.special.wheel = {
  setup : function() {
   b.event.add(this, d, c, {})
  },
  teardown : function() {
   b.event.remove(this, d, c)
  }
 };
 var d = !b.browser.mozilla ? "mousewheel" : "DOMMouseScroll"
   + (b.browser.version < "1.9" ? " mousemove" : "");
 function c(e) {
  switch (e.type) {
  case "mousemove":
   return b.extend(e.data, {
    clientX : e.clientX,
    clientY : e.clientY,
    pageX : e.pageX,
    pageY : e.pageY
   });
  case "DOMMouseScroll":
   b.extend(e, e.data);
   e.delta = -e.detail / 3;
   break;
  case "mousewheel":
   e.delta = e.wheelDelta / 120;
   break
  }
  e.type = "wheel";
  return b.event.handle.call(this, e, e.delta)
 }
 var a = b.tools.scrollable;
 a.plugins = a.plugins || {};
 a.plugins.mousewheel = {
  version : "1.0.1",
  conf : {
   api : false,
   speed : 50
  }
 };
 b.fn.mousewheel = function(f) {
  var g = b.extend( {}, a.plugins.mousewheel.conf), e;
  if (typeof f == "number") {
   f = {
    speed : f
   }
  }
  f = b.extend(g, f);
  this.each(function() {
   var h = b(this).scrollable();
   if (h) {
    e = h
   }
   h.getRoot().wheel(function(i, j) {
    h.move(j < 0 ? 1 : -1, f.speed || 50);
    return false
   })
  });
  return f.api ? e : this
 }
})(jQuery);

2 个答案:

答案 0 :(得分:6)

它定义了一个内联的匿名函数,然后立即调用该函数,传递jQuery参数。

它基本上等同于

function anonymous(b) {
   ...
}

anonymous(jQuery);

除了它有几个优点/差异:

  • 这可能是一次性功能不需要名称
  • 该函数不会影响全局命名空间,也不会有任何名称冲突,任何其他代码也不会“意外”引用它。
  • 这是一个更简洁的语法,在某些微不足道的情况下,通常更明确地定义一个简单的函数然后引用它。

事实上,如果您熟悉Java,那么优点,缺点和推理类似于Java中的匿名内部类。

函数定义括号的原因仅仅是因为Javascript中tokens绑定方式的优先级;他们需要将函数定义与其参数分开。没有它们,代码在语法上就不正确。

答案 1 :(得分:0)

  

此功能立即运行并且是   将jQuery作为参数命名   “$”。由于'$'是局部变量,我们   可以假设它总是指的   jQuery库而不是另一个   抓住全球'$'的图书馆   先变量。   Source - "How to Develop a jQuery Plugin"

我提到的文章使用了典型的$变量。在这种情况下,插件作者选择使用b。这是为了防止与可能尝试使用相同全局变量的其他Javascript库发生冲突。