匿名函数顾名思义指的是没有名字的函数, 在实际开发中使用的频率非常高! 也是学好 JS 的重点.
匿名函数: 没有实际名字的函数.
首先我们声明一个普通函数:
- // 声明一个普通函数, 函数的名字叫 fn
- function fn(){console.log("张培跃");
- }
然后将函数的名字去掉即是匿名函数:
- // 匿名函数, 咦, 运行时, 你会发现报错啦!
- function (){
- console.log("张培跃");
- }
到此, 你会发现单独运行一个匿名函数, 由于不符合语法要求, 报错啦! 解决方法只需要给匿名函数包裹一个括号即可:
- // 匿名函数在其它应用场景括号可以省略
- (function (){
- // 由于没有执行该匿名函数, 所以不会执行匿名函数体内的语句.
- console.log("张培跃");
- })
如果需要执行匿名函数, 在匿名函数后面加上一个括号即可立即执行!
- (function (){
- // 此时会输出张培跃
- console.log("张培跃");
- })()
倘若需要传值, 直接将参数写到括号内即可:
- (function (str){
- // 此时会输出张培跃好帅!
- console.log("张培跃"+str);
- })("好帅!")
匿名函数的应用场景
1, 事件
- <input type="button" value="点我啊!" id="sub">
- <script>
- // 获得按钮元素
- var sub=document.querySelector("#sub");
- // 给按钮增加点击事件.
- sub.onclick=function(){
- alert("当点击按钮时会执行到我哦!");
- }
- </script>
2, 对象
- var obj={
- name:"张培跃",
- age:18,
- fn:function(){
- return "我叫"+this.name+"今年"+this.age+"岁了!";
- }
- };
- console.log(obj.fn());// 我叫张培跃今年 18 岁了!
3, 函数表达式
- // 将匿名函数赋值给变量 fn.
- var fn=function(){
- return "我是一只小小小小留下, 怎么飞也飞不高!"
- }
- // 调用方式与调用普通函数一样
- console.log(fn());// 我是一只小小小小留下, 怎么飞也飞不高!
4, 回调函数
- setInterval(function(){
- console.log("我其实是一个回调函数, 每次 1 秒钟会被执行一次");
- },1000);
5, 返回值
- // 将匿名函数作为返回值
- function fn(){
- // 返回匿名函数
- return function(){
- return "张培跃";
- }
- }
- // 调用匿名函数
- console.log(fn()());// 张培跃
- // 或
- var box=fn();
- console.log(box());// 张培跃
模仿块级作用域
块级作用域, 有的地方称为私有作用域. JavaScript 中是没有块级作用域的, 例如:
- if(1==1){// 条件成立, 执行 if 代码块语句.
- var a=12;//a 为全局变量
- }
- console.log(a);//12
- for(var i=0;i<3;i++){
- console.log(i);
- }
- console.log(i);//4
if(){}for(){} 等没有自己的作用域. 如果有, 出了自己的作用域, 声明的变量就会立即被销毁了. 但是咱们可以通过匿名函数来模拟块级作用域:
- (function(){
- // 这里是我们的块级作用域 (私有作用域)
- })();
尝试块级作用域:
- function fn(){
- (function(){
- var la="啦啦啦!";
- })();
- console.log(la);// 报错 ---la is not defined
- }
- fn();
匿名函数的作用:
1, 通过匿名函数可以实现闭包, 关于闭包在后面的文章中会重点讲解. 在这里简单介绍一下: 闭包是可以访问在函数作用域内定义的变量的函数. 若要创建一个闭包, 往往都需要用到匿名函数.
2, 模拟块级作用域, 减少全局变量. 执行完匿名函数, 存储在内存中相对应的变量会被销毁, 从而节省内存. 再者, 在大型多人开发的项目中, 使用块级作用域, 会大大降低命名冲突的问题, 从而避免产生灾难性的后果. 自此开发者再也不必担心搞乱全局作用域了.
来源: http://www.jianshu.com/p/4124ebc2471d