将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教程: