关于js匿名函数的那些事

1、首先说写法:

当然有n种写法了


最常见的用法: 

复制代码代码如下:

(function() { 
alert('water'); 
})(); 

当然也可以带参数: 
复制代码代码如下:

(function(o) { 
alert(o); 
})('water'); 

想用匿名函数的链式调用?很简单: 
复制代码代码如下:

(function(o) { 
alert(o); 
return arguments.callee; 
})('water')('down'); 

常见的匿名函数都知道了,看看不常见的: 
复制代码代码如下:

~(function(){ 
alert('water'); 
})();//写法有点酷~ 

复制代码代码如下:

void function(){ 
alert('water'); 
}();//据说效率最高~ 

复制代码代码如下:

+function(){ 
alert('water'); 
}(); 

复制代码代码如下:

-function(){ 
alert('water'); 
}(); 

复制代码代码如下:

~function(){ 
alert('water'); 
}(); 

复制代码代码如下:

!function(){ 
alert('water'); 
}(); 

复制代码代码如下:

(function(){ 
alert('water'); 
}());//有点强制执行的味道~ 


写法看的让人感觉很离谱,但是当你打开jquery的代码,你会发现用的都是匿名函数


2、谈谈js匿名函数的优缺点

JS中的匿名函数的用法及优缺点 匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。  
这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。




  1. 一、什么是匿名函数?   
  2.   
  3. 在Javascript定义一个函数一般有如下三种方式:   
  4.   
  5. 函数关键字(function)语句:   
  6. function fnMethodName(x){alert(x);}   
  7. 函数字面量(Function Literals):   
  8. var fnMethodName = function(x){alert(x);}   
  9. Function()构造函数:   
  10. var fnMethodName = new Function('x','alert(x);')  
  11.   
  12.   
  13. 上面三种方法定义了同一个方法函数fnMethodName,   
  14.   
  15. 第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而这个函数是没有名字的,即匿名函数。  
  16.   
  17. 实际上,相当多的语言都有匿名函数。  
  18.   
  19. 二、函数字面量和Function()构造函数的区别  
  20.   
  21.    
  22.   
  23. 虽然函数字面量是一个匿名函数,但语法允许为其指定任意一个函数名,当写递归函数时可以调用它自己,使用Function()构造函数则不行。   
  24.   
  25. var f = function fact(x) { if (x < = 1) return 1; else return x*fact(x-1); };   
  26.   
  27. Function()构造函数允许运行时Javascript代码动态的创建和编译。在这个方式上它类似全局函数eval()。   
  28.   
  29. Function()构造函数每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。   
  30.   
  31. 用Function()构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。   
  32.   
  33. var y = "global";  
  34.   
  35. function constructFunction() { var y = "local"return new Function("return y"); // 无法获取局部变量 } alert(constructFunction()()); // 输出 “global”和函数关键字定义相比Function()构造器有自己的特点且要难以使用的多,  
  36.   
  37. 所以这项技术通常很少使用。  
  38.   
  39. 而函数字面量表达式和函数关键字定义非常接近。  
  40.   
  41. 考虑前面的区别,虽然有消息说字面量的匿名函数在OS X 10.4.3下的某些webkit的引擎下有bug,  
  42.   
  43. 但我们平常所说的匿名函数均指采用函数字面量形式的匿名函数。   
  44.   
  45. 三、匿名函数的代码模式   
  46.   
  47.   
  48. 错误模式:其无法工作,浏览器会报语法错。   
  49.   
  50.   
  51. function(){ alert(1); }();   
  52.   
  53. 函数字面量:首先声明一个函数对象,然后执行它。   
  54.   
  55. (function(){ alert(1); } ) ( );   
  56.   
  57. 优先表达式:  
  58.   
  59. function(){ alert(2); } ( ) );   
  60.   
  61. void操作符:   
  62.   
  63. void function(){ alert(3); }()这三种方式是等同的,hedger wang因为个人原因比较喜欢第3种,而在实际应用中我看到的和使用的都是第1种。   
  64.   
  65. 四、匿名函数的应用   
  66.   
  67.    
  68.   
  69. 《Javascript的一种模块模式》中的第一句话就是“全局变量是魔鬼”。  
  70.   
  71. 配合var关键字,匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。  
  72.   
  73. 这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。  
  74.   
  75. 实际上,YUI以及其相应的范例中大量使用匿名函数,其他的Javascript库中也不乏大量使用。   
  76.   
  77.    
  78.   
  79. Javascript的函数式编程(functional programming)的基石。  






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值