我们每个网页的Javascript文件中的这些代码行在做什么
What are these lines of code that are in every one of our web pages' Javascript files doing?
我刚刚开始的项目的所有 JS 文件都以以下行开头和结尾,谁能告诉我这里发生了什么?我认为这与OOP Javascript有关,但我不确定。
(function(pageName, $, undefined) {
// Page logic
}(window.pageName = window.pageName || {}, jQuery));
这是定义一个作用域函数,并立即使用一些参数调用它。作用域函数的目的主要是包含其中的内容,以避免创建全局变量。
因此,让我们看一下它传递的参数:
window.pageName = window.pageName || {}
这将传递现有的 window.pageName
属性(如果它有一个 truthy* 值),或者一个新的对象 ( {}
如果它没有,使用 JavaScript 非常强大的 ||
运算符,如果该操作数是真数,则会导致它的左操作数,如果不是,则会导致它的右操作数。因此,在范围限定函数中,pageName
将始终是真实的(并且可能是一个对象)。
jQuery
这是 jQuery 的非$
变量。有时你需要使用 jQuery 的noConflict
模式(释放全局$
)来与其他库集成。因此,这样做可以让您在范围函数中使用$
,知道它将等于jQuery
,即使范围函数之外的$
不是。
现在关于第三个undefined
:请注意,它实际上从未传递过参数来匹配该命名参数。这意味着undefined
参数的值将是值undefined
。这基本上确保了作用域函数中undefined
符号确实具有undefined
的值(因为在 ES5 [~2009] 之前,您可以用其他值覆盖它!
* "truthy
" - 在 JavaScript 中,如果值在用作布尔值时强制true
,则该值为"truthy"。真值是不是"假"的值(奎尔惊喜!假值是0
、NaN
、null
、undefined
、""
,当然还有false
。
它是使用存储在window.pageName
中的自定义对象的代码。当对象已实例化时,将传入该对象。如果对象不存在,则传入一个新对象。它还关闭了jQuery,并确保没有人更改undefined的定义。
这是正在发生的事情。
首先 - 创建一个接受三个参数(pageName、$ 和未定义)的匿名函数(或 IIFE)
(function(pageName, $, undefined) {...
调用函数时,传入 window.pageName(除非它是 null 或未定义的,然后传入一个空对象)作为第一个参数,然后传入 jQuery 作为第二个参数。 第三个参数不是故意传入的,用于在未定义的函数中声明局部变量。
...}(window.pageName = window.pageName || {}, jQuery));
因此,window.pageName
成为局部变量pageName
,jQuery
成为局部变量$
,undefined
是一个作为快捷方式存在的变量,因此您不必在整个函数中检查typeof someVariable === 'undefined'
。 相反,您现在可以执行类似 someVariable === undefined
的检查。
所有这些都是在没有弄乱全局空间的情况下完成的,这就是为什么您在正在处理的代码中看到它的原因。 我希望这有助于为您澄清它。
您可能应该阅读更多关于立即调用的函数表达式(IIFE)或(当我学习时如何称呼它 - 自执行匿名函数)。 关于这个主题有很多资源。
- 有什么工具可以轻松读取javascript代码吗
- 我不知道为什么我的代码是错误的?又有什么错
- 这个代码在网页中的作用和要求是什么
- 什么'这个javascript代码getElementById有问题
- 问号在这段代码中是什么意思
- 什么'这是谷歌分析跟踪代码使用的技术
- 我不知道此代码中的这些符号是什么意思.十进制到二进制
- 此nodeValue替换代码有什么问题
- 什么正在取代我的'以及“;javascript代码中使用'和&”;
- 使用较少代码隐藏和显示选择菜单内容的更好方法是什么?javascript
- 我的CSS/Javascript下拉菜单测试代码出了什么问题
- 这个代码出了什么问题?(Jquery)
- 什么'这个javascript代码有错吗?(已关闭)
- 控制台中的“function floor(){[本机代码]}”是什么
- 在 Javascript 中实现解耦代码/回调的正确方法是什么?
- 这个代码是什么意思(history.replaceState和history.pushstate)
- 什么'这是一个神奇的javascript代码,用于以及如何创建它
- 这段代码的含义是什么<%=一些可变的%>
- 有人能解释一下evaluate()和dragAndDrop()在下面的角度测试代码中调用了什么吗
- 为什么这个 JQuery 代码什么都不返回