首页 Javascript 正文
204

Javascript之匿名函数

  • yiqingpeng
  • 2015-04-30
  • 0
  •  


先来看javascript中定义函数的几种方式:

1、  函数声明定义方式:

function funcName(){}

2、  函数表达式定义方式:

var func = function(){};

3、  Function()构造函数定义方式:

var func = new Function(‘para1,para2’, ‘return para1+para2;’);

 

后两种定义方式都没有定义函数名称,所以称之为匿名函数。

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

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

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

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


var m = 'out';
function func(){
    var m ='in';
    return new Function('return m;');//这种方式构造的函数是属于全局执行环境的函数,而不是func()函数里面的函数。
}
var f = func();
alert( f() );//alert 'out', not 'in'

 

匿名函数的代码模式

(function (){})(); //括号表达式可以返回括号中代码执行的值。
(function (){}()); //由于Javascript执行表达式是从小括号里面到外面,所以可以用小括号强制执行声明的函数。
void function (){}(); //用void操作符去执行一个没有用小括号包围的一个单独操作数。据说效率最高。
~(function(){})();
+function(){}();
-function(){}();
~function(){}();
!function(){}();
//注意下面这个错误的用法
function(){}();

//以上这些形式,貌似都是利用单目运算符作用到匿名函数上。

匿名函数的链式调用


(function(m){
         alert(m);
         return arguments.callee;
})('first')('second');


匿名函数的用处:

由于javascript中没有用var定义的变量,或者是直接用function关键字在最外部定义的函数都具有全局属性,这样在编写复杂项目的时候容易造成命名冲突、变量被污染。利用匿名函数则可以很好地对代码时行封装,像jq这种第三方库用一个大的匿名函数包裹整个库代码,就是为了不向使用者暴露内部方法和变量,强制用户只能访问开放的API


正在加载评论...