(function (window, document, undefined) {})(window, document)什麽意思?
阿新 • • 發佈:2019-03-01
對象 mes fun 調用 ons dcl -i bject doc
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
(function (window, document, undefined) {})(window, document)什麽意思?