自调用匿名函数
通常定义函数并调用
function a(){
}
a();
或是
var a = function(){
}
a();
但是查看jquery源码会发现它最外层的架构是这样的
(function( window, undefined ) {
// jquery code
})(window);
解释:首先jquery是定义了一个匿名函数(所谓的匿名函数就是没有名字的函数,顺便说一下闭包的概念:闭包就是在一个函数内部定义一个函数指向外部函数的一个成员变量,并且内部定义的这个函数访问外部函数中定义的临时变量)
,在最上面的例子中a实际上是function的一个引用,只要在函数的引用后面添加()就能让函数执行,那可不可以直接在匿名函数后面添加()让匿名函数执行呢
function(){}()
执行你会发现报错,javascript引擎在扫描到function时会认为这个一个函数的声明,所以直接在后面调用()会报错,在一个语句后面直接添加括号和一个表达式后面添加括号是两个概念,在语句后面添加的操作符会被认为是分组符号,分组符号内部需要传入表达式才行,如果上面的改成function(){alert("1")}(1)就不会报错,但是上面的函数还是不会执行,这只是相当于定义了2个毫无关系的表达式,function (){} (1);在表达式后面添加括号会让表达式立即执行,但是如果是一个表达式后面添加()就会执行,所以
在匿名函数外面添加()然后再在括号后面添加()就可以进行调用了
javascript中()括起来的部分是不能包含语句的,会被当作表达式处理,所以如果function被()括起来以后就被javascript引擎作为function表达式处理了。
因此jquery最外层就是一个自调用匿名函数。但是他这么做的最大原因是想定义一个命名空间,这样就不会和全局的变量出现冲突
下面的例子是说明()的作用,()可以强制js片段执行
//方式1,调用函数,得到返回值。强制运算符使函数调用执行
(function(x,y){
alert(x+y);
return x+y;
}(3,4));
//方式二,调用函数,得到返回值。强制函数直接量执行再返回一个引用,引用再去调用执行
(function(x,y){
alert(x+y);
return x+y;
})(3,4);
//arguments.callee([参数])被用于函数内部的递归调用,这种是匿名的递归函数
也可以使用命名的递归函数,如
function factorial (x) {
if (x <= 1) {
return 1;
} else {
return x * factorial(x-1);
}
}
function和new Function()的区别
var a = function (){alert(1)}
var b = new Function('alert(1)');//大写F
new Function()与new Array()相似,都是用javascript自带的功能返回一个function或者数组
所以上面a跟b是相同的,最终都是function