2012-03-24 61 views
2

如果发现存在于所有文件Twitter的引导的application.js文件,你会发现一些下面的代码:jQuery和Twitter的引导功能说明

!function($) { 
    ... 
}(window.jQuery); 

有人能解释为什么这是对的情况下代码的第一行?

感谢

回答

2

这可以保证在函数内部的代码,你将能够使用jQuery的访问的$速记方式。在某些环境下(例如Wordpress),它们没有“简化”的“启用”以避免与其他JavaScript库冲突。通过在这里使用这种方式,您可以在任何环境中使用简单的$构造(只要定义了window.jQuery)。

因此,基本上它创建一个函数并立即调用它,传入window.jQuery。这意味着函数中的代码将会看到$ local变量,并且它被分配了window.jQuery。

6

这是一个自我执行的函数:

!function(x){}(y) 

x是函数的参数和y是您在自动调用该函数的传递参数。

!只是一个视觉指南,告诉你一目了然的功能是自我执行。另一种常见做法是将其包装在括号中。 (function(){}())

+1

“'!'只是一个视觉指南”这是不正确的。如果一行以word函数开始,那么它是一个函数声明(语句)而不是函数表达式。删除否定运算符会导致语法错误。 – sequentiallee 2014-01-06 14:10:44

3

这是因为

function($) {} (window.jQuery); 

不是语法有效,但

!function($) {} (window.jQuery); 

是有效的。

现在的问题是为什么第一个案件无效?

我们先来看看这个。匿名函数和命名函数都可以被认为是表达式,例如,

0 + function(y) { return y; } (1); 
0 + function x(y) { return y; } (1); 

都是有效的。

然后考虑这种情况,这句话包含一个表达

function x(y) { 
    return y; 
} 
(1); 

“这是不正确!”你是否可以这样说,因为你知道它们实际上是一个函数定义和一个表达式,其中一个表达式为(1)

事实是,这些代码是不明确的文法分析,因为它可能被解析为任一个功能和一个括号包裹的表达或功能调用。为了避免这种不明确的,使用Javascript规则如果function出现的语句的第一个记号,声明应该是一个函数定义。因此,function($) {} (window.jQuery);在语法中无效,因为它不是有效的函数定义。但prepose一个!甚至这种代码是有效的

0 + function x(y) { 
    return y; 
} 
(1); 

这是一个语句,用二进制加,其RHS是函数调用,它里面。