2009-06-23 114 views
10

我看着jQuery UI的代码,我发现每一个文件,这样的结构开始:这位javascript的结果是什么?

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

我的问题是:为什么会出现jQuery之前一个分号,为什么是逻辑或正在做?

JRH

+0

您的第一个问题是[JavaScript库中的前导分号做什么?](http://stackoverflow.com/q/1873983/1048572) – Bergi 2016-06-10 21:44:04

+0

或其他方式的副本?你链接的问题比这个新的几个月更新.. – jrharshath 2016-06-13 17:07:10

回答

21

为什么有jQuery的前一个分号?

分号用于确保安全文件连接。 (库和库组件经常被打包成单个文件)

为什么逻辑OR正在完成?

右侧的自助匿名函数只有在语句的左侧计算为falsey值时才会运行。因此,如果页面上已存在jQuery.ui,则该函数将不会运行。它只在jQuery.ui尚不存在时运行。

1

在英语中,该行代码说:要么jQuery.ui存在,或定义此功能...

例如如果没有定义jQuery.ui,那么该函数将被创建。

最初的分号应该没有作用 - 它只是分隔代码语句的结尾。

1

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

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

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

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

6

我猜;是为了确保JavaScript包装工不会搞砸线,但这是我拥有的最好的。

逻辑或是否确保jQuery.ui不会被声明两次。 JavaScript确实会短路,所以如果左侧评估结果为truthey(谢谢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 $