这个javascript的结果是什么?

我正在查看jQuery UI代码,我发现每个文件都以这样的结构开头:

;jQuery.ui || (function($) { 

我的问题是:为什么在jQuery之前有一个分号,为什么逻辑OR正在完成?

JRH

为什么jQuery之前有分号?

分号用于确保安全的文件串联。 (库和库组件经常打包到一个文件中)

为什么逻辑OR正在完成?

右侧的自调用匿名函数仅在语句的左侧评估为falsey值时才会运行。 因此,如果jQuery.ui已存在jQuery.ui ,则该函数将无法运行。 它只在jQuery.ui尚不存在时运行。

我在猜; 是为了确保javascript打包器不会搞砸,但这是我所拥有的最好的。

逻辑或是否确保jQuery.ui不会被声明两次。 JavaScript会短路,所以它不会评估||的右侧 如果左侧评估的是真实的东西(谢谢JP !)

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 $ 

在英语中,那行代码说:jQuery.ui存在,或者定义这个函数……

例如,如果未定义jQuery.ui,则将创建该函数。

初始分号应该没有效果 – 它只是界定代码语句的结尾。

我认为正在进行逻辑OR以允许多次包含(和评估)文件,而不是clobber本身:如果再次加载它,jQuery.ui将已经定义,它将不会做任何事情。

如果有人丢失了脚本标记的跟踪,则可能会错误地多次包含该文件。

至于分号,我只能猜测这是一个安全措施,以确保该文件如果包含在另一个文件中也可以工作,即使最后一个语句没有以分号结束。

假分号不会造成伤害,分号丢失可能会造成伤害。