1. 程式人生 > >(function (window, document, undefined) {})(window, document)什麽意思?

(function (window, document, undefined) {})(window, document)什麽意思?

對象 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)什麽意思?