博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[JavaScript] 匿名函数
阅读量:7282 次
发布时间:2019-06-30

本文共 1451 字,大约阅读时间需要 4 分钟。

1. 什么是匿名函数

匿名函数是没有名字的函数,其用途非常之多,先看看以下的例子:

function myfunc(arg) {}var myfunc = function(arg) {}

这两种定义在逻辑上等价,但是还是有区别。前者会在代码执行前被加载到作用域中,后者在代码执行到那一行时才会有定义。还有一个区别是函数声明会给函数指定一个名字,而函数表达式则是创建一个匿名函数,再将这个匿名函数赋给一个变量。

也可以像如下例子写一个匿名函数:

function(arg) {}

这段代码完全有效,但问题是无法调用这个函数,因为没有指向这个函数的指针,不过,在将函数作为参数传入另一个函数,或从一个函数中返回另一个函数时,通常都要使用这种形式来定义匿名函数。

2. 递归

递归函数即函数通过名字调用自身,例如:

function factorial(num) {  if (num <= 1) {    return 1;  }  else {    return num * factorial(num-1);  }}

但以下代码可能会导致问题:

var anotherFactorial = factorial;factorial = null;alert(anotherFactorial(10)); //错误

以上代码把factorial()函数保存在变量anotherFactorial中,然后将factorial变量设置为null,但在接下来调用anotherFactorial()时,由于必须执行factorial(),因此就会导致错误。而arguments.callee是一个指向正在执行的函数的指针,因此可以用它实现递归,例如:

function factorial(num) {   if (num <= 1) {     return 1;   }   else {     return num * arguments.callee(num-1);   } }

3. 闭包

闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数,例如:

function myfunc(arg) {  return function(myobj) {    var value = myobj[arg];  }}

在这个例子中,匿名函数访问了外部函数中的变量arg,即使这个内部函数被返回了,而且在其他地方被调用了,但它仍然可以访问变量arg。之所以还能够访问这个变量,是因为内部函数的作用域链中包含myfunc()的作用域。

4. 模仿块级作用域

JavaScript没有块级作用域,例如:

function myfunc(count) {  for (var i=0; i

在JavaScript中,变量i从有定义开始,在函数内部可随处访问,即使错误地重新声明同一个变量。JavaScript不会告诉是否多次声明了同一个变量,它会对后续的声明视而不见(但是会执行后续声明中的初始化)。匿名函数可以用来模仿块级作用域,例如:

(function() {})();

以上代码定义并立即调用一个匿名函数,将函数声明包含在一对圆括号中,表示它实际上是一个函数表达式,跟随其扣的另一对圆括号会立即调用这个函数。因此以上例子可以改写为:

function myfunc(count) {   (function() {    for (var i=0; i

转载地址:http://nszjm.baihongyu.com/

你可能感兴趣的文章
解决SQLite database is locked
查看>>
JAVA 添加、修改和删除PDF书签
查看>>
怎样配置主从同步结构
查看>>
开启mysql慢查询日志并使用mysqldumpslow命令查看
查看>>
centos下配置nginx支持php
查看>>
Linux服务器性能评估
查看>>
查看oracle当前连接数(转)
查看>>
14 用户组和权限管理4
查看>>
vmstat命令使用
查看>>
S9300端口流镜像
查看>>
mongoDB添加用户认证及简单的配置说明
查看>>
初始化的顺序
查看>>
我的友情链接
查看>>
美国主机商Webhostingpad推出中文站进军中国市场
查看>>
关于VMware HA的一些文章链接
查看>>
我的友情链接
查看>>
IDC简报:7月上旬国外最佳虚拟主机提供商Top5
查看>>
Beginning of my wonderful career
查看>>
uml 类图
查看>>
cocos2dx中的核心类
查看>>