如果发现存在于所有文件Twitter的引导的application.js文件,你会发现一些下面的代码:jQuery和Twitter的引导功能说明
!function($) {
...
}(window.jQuery);
有人能解释为什么这是对的情况下代码的第一行?
感谢
如果发现存在于所有文件Twitter的引导的application.js文件,你会发现一些下面的代码:jQuery和Twitter的引导功能说明
!function($) {
...
}(window.jQuery);
有人能解释为什么这是对的情况下代码的第一行?
感谢
这可以保证在函数内部的代码,你将能够使用jQuery的访问的$速记方式。在某些环境下(例如Wordpress),它们没有“简化”的“启用”以避免与其他JavaScript库冲突。通过在这里使用这种方式,您可以在任何环境中使用简单的$构造(只要定义了window.jQuery)。
因此,基本上它创建一个函数并立即调用它,传入window.jQuery。这意味着函数中的代码将会看到$ local变量,并且它被分配了window.jQuery。
这是一个自我执行的函数:
!function(x){}(y)
x
是函数的参数和y
是您在自动调用该函数的传递参数。
!
只是一个视觉指南,告诉你一目了然的功能是自我执行。另一种常见做法是将其包装在括号中。 (function(){}())
这是因为
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是函数调用,它里面。
“'!'只是一个视觉指南”这是不正确的。如果一行以word函数开始,那么它是一个函数声明(语句)而不是函数表达式。删除否定运算符会导致语法错误。 – sequentiallee 2014-01-06 14:10:44