2010-11-16 40 views
2

我看设立这样的jQuery插件和其他JavaScript库文件:帮助理解JavaScript的约定

(function($,window,undefined){ 
    ...plug-in code... 
}); 

为什么要来包装脚本的功能,也可以在功能获得什么ARGS ?

回答

1

除了全局函数,Javascript中唯一的作用域是函数作用域。在函数中包装代码块是确保变量不会泄露到代码其余部分的唯一方法

函数可以接收参数的唯一方法是,只要定义它时立即调用它(事实上,这是这个函数永远不会有它的代码执行的唯一途径):

(function($,window,undefined){ 
    ...plug-in code... 
})(jQuery,this,...); 
1

的原因是在doc:

,以确保你的插件不 碰撞与其他 可能会使用美元的图书馆签名,这是一个最好的 实践将jQuery传递给自己的执行函数(闭包) 将其映射到美元符号,因此它不能被 覆盖其执行范围内的另一个库。

这里阅读:http://docs.jquery.com/Plugins/Authoring

6

接收到的ARG游戏:

(function($,window,undefined){ 
    //.. 
})(jQuery, window); 

$:一个jQuery对象引用,往往能够称其为$别名发,因为在外部范围内,代码可能处于“兼容模式”。

window:该window参数常被用来缩短标识符查找。在浏览器脚本中window是全局对象的一个​​属性,为了解决它,标识符解析进程必须检查每个范围,直到达到全局范围。如果我们添加window作为参数,则无论函数如何嵌套,查找都会很短。

在非浏览器脚本环境中,window标识根本不存在,这模式是保持全球目标的轨道常见的方式,如:

(function (global, undefined) { 
    //.. 
})(this); 

注意,对于this全局代码(不是函数代码),总是指全局对象。

undefined:最后但并非最不重要的undefined的说法,它是作为一个“安全措施”,因为undefined也是全球对象的属性,并在ECMAScript的第三版规范,它的值是可变的,想象,:

undefined = true; 

这会打乱了你的代码,但如果我们有一个说法,我们不传递任何东西给它,它会保持未定义的值

幸运的是,ECMAScript第5版规范中已修复undefined,InfinityNaN不再可写。 :)

+0

哇,我不知道那里的未定义位。奇怪的是,undefined是可变的。 – Matt 2010-11-16 15:48:48

+0

'typeof myVar ==“undefined”'几乎是最安全的使用比较,但是这个安全措施很好。 – Gareth 2010-11-16 15:52:36

+0

@Matt,是的,在ECMAScript 3上是不好的,'undefined'不是* null *,'true'或'false',是全局对象的可写属性:( – CMS 2010-11-16 16:45:35