您的位置:首页 > Web前端 > JavaScript

关于js匿名函数的那些事

2015-12-28 09:41 519 查看
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时非常有效,也很优美。

一、什么是匿名函数?   

  

在Javascript定义一个函数一般有如下三种方式:   

  

函数关键字(function)语句:   

function fnMethodName(x){alert(x);}   

函数字面量(Function Literals):   

var fnMethodName = function(x){alert(x);}   

Function()构造函数:   

var fnMethodName = new Function('x','alert(x);')  

  

  

上面三种方法定义了同一个方法函数fnMethodName,   

  

第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而这个函数是没有名字的,即匿名函数。  

  

实际上,相当多的语言都有匿名函数。  

  

二、函数字面量和Function()构造函数的区别  

  

   

  

虽然函数字面量是一个匿名函数,但语法允许为其指定任意一个函数名,当写递归函数时可以调用它自己,使用Function()构造函数则不行。   

  

var f = function fact(x) { if (x < = 1) return 1; else return x*fact(x-1); };   

  

Function()构造函数允许运行时Javascript代码动态的创建和编译。在这个方式上它类似全局函数eval()。   

  

Function()构造函数每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。   

  

用Function()构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。   

  

var y = "global";  

  

function constructFunction() { var y = "local"; return new Function("return y"); // 无法获取局部变量 } alert(constructFunction()()); // 输出 “global”和函数关键字定义相比Function()构造器有自己的特点且要难以使用的多,  

  

所以这项技术通常很少使用。  

  

而函数字面量表达式和函数关键字定义非常接近。  

  

考虑前面的区别,虽然有消息说字面量的匿名函数在OS X 10.4.3下的某些webkit的引擎下有bug,  

  

但我们平常所说的匿名函数均指采用函数字面量形式的匿名函数。   

  

三、匿名函数的代码模式   

  

  

错误模式:其无法工作,浏览器会报语法错。   

  

  

function(){ alert(1); }();   

  

函数字面量:首先声明一个函数对象,然后执行它。   

  

(function(){ alert(1); } ) ( );   

  

优先表达式:  

  

( function(){ alert(2); } ( ) );   

  

void操作符:   

  

void function(){ alert(3); }()这三种方式是等同的,hedger wang因为个人原因比较喜欢第3种,而在实际应用中我看到的和使用的都是第1种。   

  

四、匿名函数的应用   

  

   

  

《Javascript的一种模块模式》中的第一句话就是“全局变量是魔鬼”。  

  

配合var关键字,匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。  

  

这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。  

  

实际上,YUI以及其相应的范例中大量使用匿名函数,其他的Javascript库中也不乏大量使用。   

  

   

  

Javascript的函数式编程(functional programming)的基石。  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: