匿名函数

网站的js文件,要面对的第一函数通常是匿名自执行函数,形如(function(){})(),它的作用有两个,一是
匿名,在java中有匿名内部类,作用类似。匿名的意思是没有声名函数的名字,这样就使得函数外部无法访问匿名自
执行函数的内部,防止函数之间变量命名的相互干扰,比如说有两个人写了两个js,放在同个网页中,如果它们没有
用匿名函数包裹,这两个js文件之间的函数会互相调用,导致错误的产生。

那么如何访问匿名函数里面的函数呢?通常是在里面的函数或变量前加上window,这样该函数或变量就成为全局的了,
在同个页面,即使是不同我js文件,也可以访问到,所以只要某个页面中加入jquery.js,那么其它js文件就可以用
jquery(*)来访问jquery.js中的函数。

匿名自执行函数的另外一个作用是自执行,其实只要在js文件中写在任何代码,只要不包括function类型,它都会执
行,它的作用有点像onload,不过onload是在页面载入完后才执行,它不用,所以如果它要调用某个页面元素,一定要
将这个页面元素放在匿名自执行函数之前,否则会产生错误。

1. 什么是自执行的匿名函数?

它是指形如这样的函数: (function {// code})();


2. 疑问

为什么(function {// code})();可以被执行, 而function {// code}();却会报错?


3. 分析

(1). 首先, 要清楚两者的区别:
(function {// code})是表达式, function {// code}是函数声明.
(2). 其次, js"预编译"的特点:
js在"预编译"阶段, 会解释函数声明, 但却会忽略表式.
(3). 当js执行到function() {//code}();时, 由于function() {//code}在"预编译"阶段已经被解释过, js会跳
过function(){//code}, 试图去执行();, 故会报错;
当js执行到(function {// code})();时, 由于(function {// code})是表达式, js会去对它求解得到返回值, 由
于返回值是一 个函数, 故而遇到();时, 便会被执行.


在jquery中,匿名自执行函数中嵌套了匿名自执行函数,形如

代码如下 复制代码
1 (function(){
2 var a=function(){};
3 (function(){
4 a()
5 })();
6 })();
这样写的目前是实现自调用,匿名自执行函数里的匿名自执行函数可以调用上级的函数。这也有点像java,类内的变量和
方法对内部类是透明的。所以a=function中a之前不用加window,我们接着往下看


声明函数的一个方法:

代码如下 复制代码
1 var afun = function(){
2 alert(1);
3 };
afun就是一个函数,准确的说是指向一个函数的变量或者指针,而如果没写afun,那么:

代码如下 复制代码
1 function(){
2 alert(1);
3 };
就是一个匿名函数,因为没有名字,但是它还确实存在在内存中。没有名字的函数我们没有办法直接调用了,调用一个函数
需要函数名加上一对小括号,比如afun()。那匿名函数能做什么呢?虽然没有名字,但是它可以把自己当成变量传给其它函数
,比如:

代码如下 复制代码
1 var fun = function(afunction){
2 if(typeof afunction == "function"){
3 afunction();
4 }
5 }
6 fun(function(){
7 alert(1);
8 });
虽然在定义这个函数时没有名字,但是它传递给fun之后,在fun的函数体内,它是有名字的,名字是afunction。这种用法其实
很常见,再比如:

代码如下 复制代码
1 dojo.connect("adiv","onclick",function(){
2 alert("onclick");
3 });
匿名函数另一种用法就是自执行。函数名后面加上一对()就是执行这个函数,那么下面这个括号表达式就是定义一个函数,括号
表达式的返回值就是这个函数:

代码如下 复制代码
1 (function(){
2 alert(1);
3 });
在外面这对括号后再加上(),就是执行括号表达式返回的函数:

代码如下 复制代码
1 (function(){
2 alert(1);
3 })();
这个就是匿名自执行函数,首先它没有名字,其次,它在定义之后会直接被执行,而且它没法再被执行,因为它没有名字。匿名自
执行函数可以传参:

代码如下 复制代码
1 (function(i){
2 alert(i);
3 })(1);
匿名自执行函数有很多用处,主要是用于封装,比如看jquery或者dojo的源码发现它们都是封装在匿名自执行函数中,这样就可以
做到页面加载时自动初始化,而且向外公开它想公开的属性和方法,而用到的临时变量可以安全封闭在匿名函数内。

原文地址:https://www.cnblogs.com/benbenjia/p/9875655.html