这个javascript的结果是什么?

时间:2009-06-23 10:20:28

标签: javascript jquery jquery-ui

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

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

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

JRH

4 个答案:

答案 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将已经定义,并且它不会做任何东西。

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

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

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