1. 程式人生 > >JS (function (window, document, undefined) {})(window, document)的真正含義

JS (function (window, document, undefined) {})(window, document)的真正含義

運行 query defined nta pre 文章 scrip javascrip 解釋

原文地址:What (function (window, document, undefined) {})(window, document); really means

按原文翻譯

在這篇文章中,我們將探討標題所暗示的內容,並解釋自調用函數設置給我們帶來了什麽。

有趣的是,我被問到關於IIFE(即時調用的函數表達式)的很多,它采用以下設置:

(function (window, document, undefined) {
  // 
})(window, document);

那麽為什麽不寫一篇關於它的文章呢? :-)

首先,這是一系列不同的事情。從頂部:

JavaScript具有函數作用域,因此首先創建了一些需要的“私有範圍”。例如:

(function (window, document, undefined) {
  var name = ‘Todd‘;
})(window, document);

console.log(name); //name is not defined,它在一個不同的範圍內

Simple.

一個正常函數是這樣的:

var logMyName = function (name) {
  console.log(name);
};

logMyName(
‘Todd‘);

我們可以選擇調用它,在任何我們需要/想的位置。

“IIFE”之所以被創造出來是因為它們是直接調用的函數表達式。

這意味著它們在運行時被立即調用,

我們也不能再調用它們了,它們只運行一次:

var logMyName = (function (name) {
  console.log(name); // Todd
})(‘Todd‘);

這裏的秘訣是,(我在前面的例子中給一個變量賦值):

(function () {
  
})();

多余的一對括號是必要的,因為這樣不起作用:

function () {
  
}();


雖然可以通過一些技巧來欺騙JavaScript“使其工作”。
這樣強制JavaScript解析器處理 ! 後面的代碼:

!function () {
  
}();

還有其他的變體:

+function () {
  
}();
-function () {
  
}();
~function () {
  
}();


但我不會用它們。

請參閱@ mariusschulz分解JavaScript的IIFE語法,詳細解釋IIFE語法及其變體。

https://blog.mariusschulz.com/2016/01/13/disassembling-javascripts-iife-syntax

現在我們知道了它是如何運作的,我們可以將論證傳遞給我們的 IIFE:

(function (window) {
  
})(window);

它是如何工作的呢?
記住, (window); 是調用函數的地方,
我們通過窗口對象。
然後這個函數被傳遞到函數中,我也把它命名為window。
你可以認為這是毫無意義的,因為我們應該給它命名不同的東西,但是現在我們也將使用窗口。

我們還能做什麽呢?把所有的東西都傳過去!讓我們通過文檔對象:

(function (window, document) {
  // 我們通常需要 window 和 document 
})(window, document);

那麽關於 undefined 呢?

在ECMAScript 3中,未定義的是可變的。

這意味著它的值可以被重新分配,比如undefined = true;

oh my! 幸運的是,在 ECMAScript 5 中的 (‘use strict‘;)語法將會拋出一個錯誤告訴你你是一個白癡。

在此之前,我們開始保護自己的 IIFE:

(function (window, document, undefined) {

})(window, document);

也就是說,如果有人來做這件事,我們會沒事的:

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);

想象一下,你對函數庫、windowdocument 的所有引用都很好地縮小了。
當然你不需要停下來,
我們也可以通過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();
或者任何東西作為$被分配到模塊的本地。
了解範圍和全局/局部變量如何工作將進一步幫助您。

還剩下一小段,不想看了,餓了。感覺好像被塞了一把JS的知識。

原因只是我想知道這樣一段代碼什麽意思。

(function (angular) {
    ‘use strict‘;

    //do something
    
})(window.angular);

JS (function (window, document, undefined) {})(window, document)的真正含義