1.IIFE(即时调用的函数表达式),它采取以下表达式:
(function (window, document, undefined) {
//
})(window, document);
JavaScript具有函数作用域,因此可以创建一些需要的“私有范围”。
“IIFE”之所以被创造出来是因为它们是直接调用的函数表达式。
这意味着它们在运行时被立即调用,我们也不能再调用它们了,它们只运行一次。
(function (window) { })(window);
(window); 是调用函数的地方,我们通过window对象,然后这个函数被传递到函数中,我也把它命名为window。
你可以认为这是毫无意义的,因为我们应该给它命名不同的东西,但是现在我们也将使用window。
我们还能把所有的东西都传过去:
(function (window, document) {
// 我们通常需要 window 和 document
})(window, document);
2.那么undefined是啥??
在ECMAScript 3中,undefined是可变的,这意味着它的值可以被重新赋值,比如undefined = true;
幸运的是,在 ECMAScript 5 中的 ('use strict';)语法将会抛出一个错误。
于是我们可以通过传入undefined来保护自己的 IIFE,也就是说如果有人来给undefined赋值了,也不会有问题:
undefined = true;
(function (window, document, undefined) {
// undefined 是一个局部未定义的变量
})(window, document);
缩小局部变量是IIFE模式的神奇之处,传入局部变量名可以随意的命名:
(function (window, document, undefined) {
console.log(window); // Object window
})(window, document);
// 这两个功能是一样的
(function (a, b, c) {
console.log(a); // Object window
})(window, document);
也可以将jquery引进来:
(function ($, window, document, undefined) {
// use $ to refer to jQuery
// $(document).addClass('test');
})(jQuery, window, document); (function (a, b, c, d) {
// becomes
// a(c).addClass('test');
})(jQuery, window, document);
这也意味着你不需要调用jQuery.noConflict();或者其他任何东西来替代$。
备注:
What (function (window, document, undefined) {})(window, document); really means