var a = 2; // 声明全局变量a ( function foo (globel) { var a = 3; console.log(a); // 调用局部变量 3 console.log(globel.a); // 调用全局变量 2 } ( window )); console.log(a); // 调用全局变量 2
第二种写法和第一种很像:
var a = 2; // 声明全局变量a ( function foo (globel) { var a = 3; console.log(a); // 调用局部变量 3 console.log(globel.a); // 调用全局变量 2 } )( window ); // 后面加这个括号是为了立即执行这个包装函数,并传入参数window console.log(a); // 调用全局变量 2
第三种是UMD模式(项目中被广泛使用,尽管这种模式略显冗长,但是更容易让人理解):
var a = 2; (function iife (def) { def(window); // 2.执行def函数(def是被传入的函数),调用def函数并传入参数window.在下方执行代码块。 })(function def (globel) { // 1.将def函数作为参数传入iife函数。 var a = 3; console.log(a); // 打印局部变量 3 console.log(globel.a); // 打印全局变量 2 }); console.log(a); // 打印全局变量 2
topic: 这样写的好处是不会污染外部作用域。 比如 function foo () { ... } 这样的函数是可以直接在外部调用的; 但是(function foo () { ... })这样的函数声明就只能在{ ... }内部调用了。