匿名函数在声明时不用带上函数名, 可以把匿名函数当作一个function类型的值来对待

声明一个普通的函数 function func() { ... } 可以认为和var func = function() { ... };相同, 但是普通函数会自动把函数名"提到"作用域的最前面, 基本上普通函数和匿名函数就只有这一个区别

1
2
3
4
5
6
7
function xxx() {
    foo(); //foo被提到了作用域的最前面, 于是这里可以正常调用foo函数
    bar(); //这里会报错bar是个undefined
    function foo(){}
    var bar = function(){};
}

S中的匿名函数的用法及优缺点
匿名函数可以有效的保证在页面上写入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)的基石。

具体请看《用函数式编程技术编写优美的 JavaScript》和《函数式JavaScript编程指南》。

转载于:https://www.cnblogs.com/zhouj850/p/7272812.html

js的匿名函数 和普通函数相关推荐

  1. 胡扯JS系列-匿名函数的自动运行

    函数有很多种,我们就选择我们不懂的函数开始学习! JS中自动运行的匿名函数 在JavaScript中可以使用匿名函数(在我们学习Java的时候也有类似的概念,匿名实现类),在JavaScript中的函 ...

  2. js 匿名函数_javascript:函数的使用

    大家好,我是专注于前端开发,前端入门,精神可爱的前端小学妹,本期为大家带来的Web前端学习知识是"javascript:函数的使用",喜欢Web前端的朋友,一起看看吧! 主要内容: ...

  3. js匿名函数、箭头函数,区别

    js匿名函数.箭头函数,以及他们的区别 匿名函数 箭头函数 区别 1.匿名函数 简单点说就是没有名字的函数,在声明函数时不写函数名称,(将函数赋值给变量)叫匿名函数. 匿名函数可以有效的保证在页面上写 ...

  4. Js中匿名函数的理解

    目录 1.js中匿名函数的N种写法 最常见的用法: 2.JavaScript 匿名函数及闭包 2.1 匿名函数 2.1.1 函数的定义 2.1.2 匿名函数的创建 2.2 闭包 2.3 举例 2.4 ...

  5. 【转】js之匿名函数

    这篇博文内容来自于javascript高级程序设计第2版,向作者致敬 函数声明: function functionName(arg0,arg1){ //函数体 } 函数表达式: var functi ...

  6. java调用js匿名函数参数,js中匿名函数和回调函数

    匿名函数: 通过这种方式定义的函数:(没有名字的函数) 作用:当它不被赋值给变量单独使用的时候 1.将匿名函数作为参数传递给其他函数 2.定义某个匿名函数来执行某些一次性任务 var f = func ...

  7. php的匿名函数和闭包函数

    php的匿名函数和闭包函数 tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use 引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因 ...

  8. android 调用js怎么获取返回值_js 函数

    函数是一个特殊的对象 具名函数 function 函数名(形式参数1,形式参数2){ 语句 return 返回值 } 匿名函数 上门的具名函数,去掉函数名就是匿名函数 let a =function( ...

  9. JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别

    函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...

  10. 函数的实参 函数的形参 闭包 js

    函数的实参和形参 可选形参 if(a === undefined) a = []; 等价于 a = a || []; 这两句是完全等价的,只不过后者需要提前声明a而已 如果参数没有传入,其余的填充un ...

最新文章

  1. 卫星图像中的车辆分析--A Large Contextual Dataset for Classification, Detection and Counting of Cars
  2. leetcode- nim game
  3. Android 关于Handler
  4. 【总结】有三AI所有GAN相关学习资料汇总,有图文、视频、代码实战等......
  5. jaxws-webservice编程续
  6. XML内部DTD约束 Day24
  7. [Kubernetes] 在K8S上部署MySQL 8.0并数据持久化
  8. 分组数据方差公式_连续变量假设检验 之 单因素方差检验
  9. 对钱感兴趣?聊聊互联网工资收入的组成
  10. 山东理工oj答案java_众数问题(山东理工OJ)
  11. 聊城市计算机专业,聊城市关于2018年下半年计算机技术与软件专业技术资格(水平)考试考务工作有关问题的通知...
  12. MATLAB画图线型、颜色、标记符、特殊符号、技巧汇总
  13. 各种常用的JSON接口
  14. 区块链开发入门到精通
  15. Ubuntu14.04显示隐藏文件
  16. linux修改为英文环境、中文输入
  17. 目标检测论文核心思想,18-19-20年论文梗概
  18. graphite安装笔记
  19. JDBC插入数据后返回新数据id
  20. 如何解决安卓手机抓包显示无网络/网络异常

热门文章

  1. java实现rabbitmq动态路由/话题模型(topic queues), 生产者 消费者 交换机 消息队列
  2. java虚拟机内存模型与垃圾回收知识复习总结
  3. MySQL数据库与Oracle数据库在存储中文字符以字节或字符存储的区别
  4. 图书配套光盘、部分软件下载
  5. 2021-02-23 天地图图层类型总结
  6. 2019-12-02 调用C++高精度时钟 std::chrono::high_resolution_clock的方法
  7. 非资深玩家留言频率限制(1024秒限制)
  8. GDAL对于raw数据支持的一个bug
  9. html——windows.onload()与$(document).ready()区别
  10. java调用arcgis soe发布的rest服务,中文传值乱码问题