这个JavaScript / jQuery语法是什么意思?

以下语法是什么意思?

(function($){ $.fn.columnize = function(options) { ... 

什么是function($)

什么是$.fn. … $.fn. …

这个约定在编写插件时使用,以确保没有使用$符号的其他Javascript库的confilict,同时确保插件的作者仍然可以使用这个notataion:

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

作者声明一个具有单个参数($)的匿名函数,然后立即调用它并将jQuery对象传递给它。 这确保函数被调用,并且它的所有内容都被定义了。

更长的符号可能是:

 function MyDefs($){ ... } MyDefs(jQuery); 

虽然这会在全局命名空间中创build一个variablesMyDefs 。 匿名函数模式将全局名称空间留空,从而避免冲突。

它将columnize函数声明为一个jQuery插件,允许您在$('.someSelector').columnize()这样的元素上使用它。 你可以在这里阅读关于插件创作的更多信息。

这可能是一个jQuery扩展,基本上通过(jQuery)在最后

 (function($){ //$ is jQuery here //added columnize function to existing jQuery object $.fn.columnize = function(options) { } })(jQuery); 

我刚刚发现这是一个代理模式?

代理模式

结合上述知识,您可以为JavaScript开发者提供相当多的权力。 一种结合的方法是在JavaScript中实现代理模式,实现面向方面编程(AOP)的基础:

 (function() { // log all calls to setArray var proxied = jQuery.fn.setArray; jQuery.fn.setArray = function() { console.log(this, arguments); return proxied.apply(this, arguments); }; })(); 

上面的代码包含在一个函数中以隐藏“代理”variables。 它将jQuery的setArray方法保存在闭包中并覆盖它。 代理然后logging对该方法的所有调用并将该调用委托给原始。 使用apply(this,arguments)可以保证调用者不会注意到原始代码和代理方法之间的区别。

不要被$弄糊涂了。 实际上, $是JavaScript中的有效variables名(所有包含$ , source(PDF)的variables)。

所以,第一行可以改写为

 (function (someVariable) { 

这可能看起来更常见。 其余的,是的,这是一个代理模式,詹姆斯怀斯曼的回答是解释,发生了什么事情。

function($) {...}定义了一个名为$的forms参数的匿名函数。 $.fn引用由variables$引用的对象的名称为fn的属性。