將undefined傳遞給JavaScript立即調用的函數表達式

有時候,您可以在野外發現舊代碼undefined傳遞給函數。為什麼?

我在看著名的電影時發現了這個小把戲Paul Irish有關jQuery源代碼的視頻

該視頻來自不同的時代,在撰寫本文時已經有9年的歷史了,此後jQuery源代碼已經發生了變化,因此您無法在其中發現該東西,但這仍然讓我感到很有趣。

此外,JavaScript也發生了變化。此技術僅適用於ES5之前的JavaScript。

在2009年發布ES5之前,這幾乎是必需的步驟。

注意:ES5 +代碼庫無需再添加它,因為現在undefined是一個只讀值。

有時,在我們的代碼中,我們會通過以下方式檢查變量以查看它們是否未定義:

if (car !== undefined) {

}

如果這是我們的代碼,並且在我們控制的我們自己的服務器上運行,則應該可以正常工作。但是想像一下,像jQuery這樣的庫需要經過實戰測試,才能在每個可能的站點上工作。

如果有人覆蓋undefined一個簡單的

undefined = '🤔' //whatever value you prefer

然後上面if會失敗,比較car🤔

此問題已在ES5中修復,但在此之前是可能的。

如果car實際上是不確定的,現在無法找到答案。

除了使用這種技術:我們將所有代碼包裝在IIFE中(立即調用的函數表達式),然後將一個參數傳遞給函數定義,而無需在調用階段將其添加。

(function() {
  /* our function code */
})()
(function(undefined) {
  /* our function code */
})()

看,undefined在調用函數時作為參數傳遞,但不作為參數傳遞。因此,在函數內變量的值undefined是(保證)的原始值undefined。無論頁面上其他腳本如何執行此操作,它都是孤立的。

現在,我最喜歡的解決此問題的方法是使用此技術檢查未定義的值:

if (typeof car !== 'undefined') {

}

typeof運算符返回具有變量類型的字符串。我們可以對照'undefined'字符串,並且我們首先不會遇到上述問題。

但是,總是知道一些可以在其他人編寫的代碼上閱讀的東西的原因,尤其是當它需要在任何地方運行的庫級代碼時,總是很高興。

免費下載我的JavaScript初學者手冊


更多js教程: