`
zhangziyueup
  • 浏览: 1170245 次
文章分类
社区版块
存档分类
最新评论

详解Javascript匿名函数的使用

 
阅读更多

一、什么是匿名函数? 网页教学网

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

Webjx.Com


函数关键字(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()构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。
vary = "global"; function constructFunction() { var y = "local"; returnnew Function("return y"); // 无法获取局部变量 } alert(constructFunction()());// 输出 “global”
和函数关键字定义相比Function()构造器有自己的特点且要难以使用的多,所以这项技术通常很少使用。而函数字面量表达式和函数关键字定义非常接近。考虑前面的区别,虽然有消息说字面量的匿名函数在OS X10.4.3下的某些webkit的引擎下有bug,但我们平常所说的匿名函数均指采用函数字面量形式的匿名函数。

Webjx.Com

三、匿名函数的代码模式

昨天 hedger wang 在他的blog介绍了 几种匿名函数的代码模式:

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

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

函数字面量:首先声明一个函数对象,然后执行它。
(function(){ alert(1); } ) ( );
优先表达式:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数。
( function(){ alert(2); } ( ) );
Void操作符:用void操作符去执行一个没有用圆括号包围的一个单独操作数。
void function(){ alert(3); }()
这三种方式是等同的,hedger wang因为个人原因比较喜欢第3种,而在实际应用中我看到的和使用的都是第1种。

四、匿名函数的应用 Webjx.Com

《Javascript的一种模块模式》中的第一句话就是“全局变量是魔鬼”。配合var关键字,匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。实际上,YUI以及其相应的范例中大量使用匿名函数,其他的Javascript库中也不乏大量使用。
Javascript的函数式编程(functional programming)的基石。具体请看《用函数式编程技术编写优美的 JavaScript》和《函数式JavaScript编程指南》。

分享到:
评论

相关推荐

    详解JavaScript匿名函数和闭包

    本文主要通过一些简单的小例子,简述匿名函数和闭包的常见用法,仅供学习分享使用,如有不足之处,还请指正。 普通函数 普通函数由fucntion关键字,函数名,() 和一对{} 组成,如下所示: function box(){ return...

    JavaScript中匿名函数的用法及优缺点详解_.docx

    JavaScript中匿名函数的用法及优缺点详解_.docx

    JavaScript中匿名函数的用法及优缺点详解

    匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。 这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。 一、什么是匿名函数? 在Javascript定义一个函数一般有如下三种方式...

    Javascript中匿名函数的调用与写法实例详解(多种)

    如var fun = function(){},这里function如果不赋值给fun那么它就是一个匿名函数。好,看看匿名函数的如何被调用。 方式1,调用函数,得到返回值。强制运算符使函数调用执行 (function(x,y){ alert&#40;x+y&#41;; ...

    【JavaScript源代码】JavaScript中箭头函数与普通函数的区别详解.docx

    JavaScript中箭头函数与普通函数的区别详解  本文为大家讲解了JavaScript中箭头函数与普通函数的区别,供大家参考,具体内容如下 let fun = () =&gt; { console.... 箭头函数是匿名函数,不能作为构造函数,不能使用n

    JavaScript中匿名函数的用法及优缺点详解_.pdf

    ...

    [hook.js]通用Javascript函数钩子

    methodName[String|opt]:匿名函数需显式传入目标函数名eg:this.Begin = function(){....}; } [bool]unhook:params{ realFunc[String|must]:用于保存原始函数的函数名称,用于unHook; funcName[String|must]:被Hook...

    js匿名函数作为函数参数详解

    温故知新,今天又回味了一遍,匿名函数作为函数参数。 代码很短,五脏俱全。 &lt;!DOCTYPE html&gt; &lt;html lang=en&gt; &lt;head&gt; &lt;/head&gt; &lt;body&gt; [removed] function test( a, b ){ a+=1; ...

    JavaScript function函数种类详解

    本篇主要介绍普通函数、匿名函数、闭包函数 目录 普通函数:介绍普通函数的特性:同名覆盖、arguments对象、默认返回值等。 匿名函数:介绍匿名函数的特性:变量匿名函数、无名称匿名函数。 闭包函数:介绍闭包...

    详解javascript函数写法大全

    2.匿名函数,函数保存到变量里 var myfn = function(){ console.log(匿名函数,函数保存到变量里); } 3.如果有多个变量,可以用对象收编变量 3.1 用json对象 var fnobject1={ fn1:function(){ console.log(第...

    JavaScript详解(第2版)

     7.1.3 匿名函数变量   7.1.4 闭包   7.1.5 递归   7.1.6 函数是对象   7.2 调试技巧   7.2.1 函数语法   7.2.2 使用try/catch和throw捕捉异常   7.3 应知应会   练习   第8章 对象  ...

    详解JavaScript中常用的函数类型

    主要介绍了三种JavaScript中常用的函数类型,包括匿名函数、动态函数、可变参数函数,感兴趣的小伙伴们可以参考一下

    JavaScript中立即执行函数实例详解

    ( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因...

    javascript 回调函数详解

    在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。因此callback 不一定...

    JavaScript函数模式详解

    在javascript中,函数是一类对象,这表示他可以作为参数传递给其他函数;...//又名匿名函数 var add = function(a,b){  return a+b; }; 函数的声明 代码如下: function foo(){  //code here } //这里可以不需要分

Global site tag (gtag.js) - Google Analytics