我看到JQuery插件和其他javascript库文档设置如下:
(function($,window,undefined){
...plug-in code...
});
为什么有必要将脚本包装在一个函数中,该函数可以接收哪些args?
答案 0 :(得分:6)
收到的args是:
(function($,window,undefined){
//..
})(jQuery, window);
$
:jQuery对象的引用,通常用于将其作为$
别名引用,因为在外部作用域中代码可能是在“兼容模式”中。
window
:window
参数通常用于缩短标识符查找。在浏览器脚本中window
是全局对象的属性,为了解决它,标识符解析过程必须检查每个范围,直到它到达全局范围。如果我们添加window
作为参数,那么无论我们的函数如何嵌套,查找都会很短。
在非浏览器脚本环境中,window
标识符甚至不存在,并且该模式是跟踪Global对象的常用方法,例如:
(function (global, undefined) {
//..
})(this);
请注意,全局代码(非功能代码)的this
值始终引用全局对象。
undefined
:最后但并非最不重要的是undefined
参数,它被用作“安全措施”,因为undefined
也是一个属性对于Global对象,在ECMAScript第3版规范中,它的值是可变的,想象一下:
undefined = true;
那会弄乱你的代码,但是如果我们有一个参数,并且我们没有传递任何东西,那么它将保存未定义的值。
幸运的是,ECMAScript第5版规范修复了undefined
,Infinity
和NaN
不再可写。 :)
答案 1 :(得分:1)
除了全局之外,Javascript中唯一的范围是函数范围。在函数中包装代码块是确保变量不会泄漏到代码其余部分的唯一方法
函数可以接收参数的唯一方法是,只要它被定义就被调用(实际上,这是该函数执行代码的唯一方法):
(function($,window,undefined){
...plug-in code...
})(jQuery,this,...);
答案 2 :(得分:1)
原因在于doc:
确保您的插件没有 与其他图书馆发生冲突 可能会使用美元符号,这是最好的 练习将jQuery传递给自己 执行映射的函数(闭包) 它到美元符号所以它不可能 被另一个图书馆覆盖 执行范围。