一,在贤心大神的 laydate.js 代码里看到的,开头是 ;!function ( win,undefined ) {}结束还有个 ( window ) 啥意义呢?
分号是为了合并压缩的时候和其他函数做分割用的;感叹号是用于立即执行函数的,你可以换成加号减号的,和用括号包裹函数体作用一样。
+function (){}
-function (){}
!function (){}
~function (){}
(function (){})()
这种写法可以保证匿名函数立即运行且运行一次
传入的 window 对象从全局变成了局部对象 优点有
1. 运行更快了
2. 可以随意改名 比如 a, 这样便于压缩
3. 可以传入其他库而不导致冲突
举例子
(function ($, w, d, undefined){
$(document).addClass('test');
})(jQuery, window, document);
这样的情况下 JQ 可以无痛使用 也不需要使用 noConflict 方法避免冲突
至于传递 undefined 是因为 ES3 时代这个玩意儿是可以被修改的……真的有人会去做比如 undefined = true 这样的事情 所以说额外定义一个真正的 undefined 可以保证匿名函数内部的 undefined 是真正的 undefined(好累……
二,为什么js文件开头加 ; 或 +呢?
答 :js 文件结束 处是 没有 分号的。若几个 js 连在一起时,2个 js 连接处 会发生语法上的混淆。 开头加 ; 用于分隔, 可以避免多文件 压缩 在一起时 引起的 错误。 分号和分号放在一起也没问题,相当于 “空语句”。 加号。相当于加了一层小括号。例如: +function(){}(); 相当于: (function() { console.log("Foo!"); })(); // 或相当于 (function() { console.log("Foo!"); }()); 如果没有这个加号的话,解析器会认为function是一个函数声明的开始,而后面()将会导致语法错误。在function前面加上+号时, 就变成了一个函数表达式,而函数表达式后面又添加了一个()就变成了一个立即执行的函数了。