我正在查看jQuery UI代码,我发现每个文件都以这样的结构开头:
;jQuery.ui || (function($) {
我的问题是:为什么在jQuery
之前有分号,为什么逻辑OR正在完成?
JRH
答案 0 :(得分:21)
为什么jQuery之前会有分号?
分号用于确保安全的文件串联。 (库和库组件经常打包到一个文件中)
为什么逻辑OR正在完成?
只有当语句的左侧评估为falsey值时,右侧的自调用匿名函数才会运行。因此,如果页面上已存在 jQuery.ui
,则该功能将无法运行。它仅在 jQuery.ui
尚不存在时运行。
答案 1 :(得分:6)
我猜;
是为了确保javascript打包器不会弄乱这条线,但那是我最好的。
逻辑或是否确保jQuery.ui
未被声明两次。 JavaScript会短路,因此如果左侧评估为truthey 的某些内容,则不会评估||
的右侧(感谢JP!)< / em>的
Bonus语法解密,传递给匿名函数的$是对jQuery的引用。在点击之前我不得不一直向下滚动页面: - )
所以,这是上面一行的细分版本
; // extra semi colon to ensure correct concatenation and minifying
jQuery.ui // check if the variable called jQuery.ui is truthey
|| // OR if jQuery.ui isn't defined
(function($) {...})(jQuery); // define and execute an anonymous function
// passing in the conflict safe jQuery
// as the parameter called $
答案 2 :(得分:1)
在英语中,那行代码说:jQuery.ui存在,或者定义这个函数......
E.g。如果没有定义jQuery.ui,那么将创建该函数。
初始分号应该没有效果 - 它只是界定代码语句的结尾。
答案 3 :(得分:1)
我认为正在进行逻辑OR以允许多次包含(和评估)文件,而不是clobber本身:如果再次加载它,jQuery.ui将已经定义,并且它不会做任何东西。
如果有人丢失了脚本标记的跟踪,则可能会错误地多次包含该文件。
至于分号,我只能猜测这是一个安全措施,以确保该文件在包含在另一个文件中时也能正常工作,即使最后一个语句没有以分号结束也是如此。
虚假的分号不会造成伤害,可能会丢失分号。