(function(window, undefined){ // 代码... })(window);二、括号的意义
~function(){ // 代码...}();或者这种方式:
+function(){ // 代码...}();其实,作用都一样,都是把function(){}转化成一个可执行的表达式,方便执行。
2.1 第二个括号的意义
理解了第一个括号的意义,第二个括号就很简单了,就是执行表达式了。
三、参数的意义
以这段代码为例子,讲解参数
var wall = {};(function(window, WALL, undefined){})(window, wall);参数分为形参和实参。
if(wall == undefined){ // 代码...}所以,这里多加一个形参的目的就是为了防止这种情况发生。只要在这个IIFE作用域内,undefined就能够正常获取到。
var wall = {}; // 声明定义一个命名空间wall// 定义方法(function(window, WALL, undefined){ // 给wall命名空间绑定方法say WALL.say = function(){console.log("hello"); };})(window, wall);(function(window, WALL, undefined){ // 给wall命名空间绑定方法 whoIam WALL.whoIam = function(){console.log("wall"); };})(window, wall);// 调用wall.say();wall.whoIam();先定义一个命名空间,然后再给这个命名空间加东西。这是最普遍的写法,也是最好理解的。
var wall = (function(window, WALL, undefined){ if(typeof WALL == "undefined"){WALL = {}; } // 给wall命名空间绑定方法say WALL.say = function(){console.log("hello"); } return WALL; // 返回引用})(window, wall);var wall = (function(window, WALL, undefined){ if(typeof WALL == "undefined"){WALL = {}; } // 给wall命名空间绑定方法 whoIam WALL.whoIam = function(){console.log("wall"); } return WALL; // 返回引用})(window, wall);// 调用wall.say();wall.whoIam();放大模式的好处就是,可以不用考虑代码加载的先后顺序。
(function(window, WALL, undefined){ // 给wall命名空间绑定方法say WALL.say = function(){console.log("hello"); }})(window, window.wall || (window.wall = {}));(function(window, WALL, undefined){ // 给wall命名空间绑定方法 whoIam WALL.whoIam = function(){console.log("wall"); }})(window, window.wall || (window.wall = {}));// 调用wall.say();wall.whoIam();宽放大模式的重点注意的地方:就是在实参部分的window.wall || (window.wall = {})。
;(function(window, WALL, undefined){ // 给wall命名空间绑定方法say WALL.say = function(){console.log("hello"); }})(window, window.wall || (window.wall = {}));眼尖的已经看出区别了,就是文件开始的地方,先写上分号;。
// a.js 文件wall.log()// b.js 文件(function(window, WALL, undefined){ // 给wall命名空间绑定方法say WALL.say = function(){console.log("hello"); }})(window, window.wall || (window.wall = {}));由于a.js文件的wall.log()少写了分号,跟b.js文件合并后,js就会认为‘wall.log()(...)"是需要这么执行的,结果代码就报错了。