以下为总结
在开源的JavaScript框架中能看到很多这样语法结构
(function(){
}
)()
比如我最近看的jQuery,及chediter。刚开始的时候我看到这样的结果有点奇怪,它是怎么执行的,并且这是什么样的语法结构,最近偶尔看闭包的时候,才发现原来这是JavaScript种匿名函数(看到这个有点汗,java的匿名类见过,就从来没想到JavaScript中会有匿名函数,也是学的不够牢固)。
现在我们了解到以上是JavaScript匿名函数的语法结构,怎么声明函数,匿名函数JavaScript是怎么执行的,匿名函数的代码模式。这些问题

就是我们接下来要探讨的问题。
第一:怎么声明函数。
方法一  function functionName( arguments ){ body }
在JavaScript函数典型函数,也叫有名函数(因为它存在functionName)。
function fun(){ alert( "test" ) }//  1
fun();//2
第1行这是JavaScript声明有名函数最常见的方法,也是我们个人开发中最常用的声明方式。
该语法结构为声明一个名叫fun的函数(注意JavaScript只会编译该函数,并生成fun函数的对象,不会执行该函数)。
而第二句为调用该函数即执行该函数。
方法二 var fun = function ( arguments  ){ body  } //又称函数字面量
var fun = function( ){ alert( "test" ) }
该函数复制给变量fun,其实后面的函数为一个匿名函数
方法三 var fun=new Function([arguments], Body);
将函数复制给变量fun
注意该种方式会存在性能问题,在执行 new Function方法时它不是静态编译和执行,而是动态编译和执行,即当执行new Function时才编译函数主体,并生成函数对象,每调用一次就执行编译及执行的过程【类似于函数eval()】,它比其他方是多了编译过程【会使用浏览器的编译器

】,如果再循环体中执行效率会比较低;上面三种定义函数方式中,后两种方式是采用匿名函数的方式什么的变量。
第二:匿名函数是怎样执行的。
对于语法结构

  1. (function(){
  2. alert( "test" );
  3. }
  4. )()

其实是由两部分组成
(function(){
    alert( "test" );
}
)表示的为匿名函数的定义。
而对于接在后面的"()"代表的意思为执行定义的匿名函数。
上述的语法结构也等价于以下的语法结构

  1. var test=function(){
  2. alert( "test" );
  3. //函数内容
  4. };//声明匿名类并将匿名函数赋予变量test。
  5. test();//执行test

可以看出匿名类可以直接在类后面接()代表执行,这也是我们在jQuery等开源的框架时,导入相应的包以后就可以直接使用对象的原因。它已经在匿名函数中完成相应的初始化及封装。
知道匿名类是怎么执行的,那我们常用的匿名函数有哪些呢。
第三:匿名函数调的代码模式
hedger wang介绍了几种匿名函数的代码模式:
错误模式:其无法工作,浏览器会报语法错。

  1. function(){
  2. alert(1);
  3. }();

以上错误原因是()能更改表达式的优先级,使用()后,将先执行()里面的代码,而对于表达式()对于JavaScript编译不过去的。
函数字面量:首先声明一个函数对象,然后执行它。 也称为立即执行函数。

  1. (function(){
  2. alert(1);
  3. } ) ( );

编译一定能通过,第一()是函数定义,而第二个()代表执行第一括号里面的内容
优先表达式:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数。

  1. ( function(){
  2. alert(1);
  3. } ( ) );

Void操作符:用void操作符去执行一个没有用圆括号包围的一个单独操作数。

  1. void function(){
  2. alert(1);
  3. }()

这三种方式是等同的,hedger wang因为个人原因比较喜欢第3种,而在实际应用中我看到的和使用的都是第1种以及上面提到的 new Funtion( )的定义方式。

灵活的配合var关键字,匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。也能增加代码的可读写行,减少代码量,提高程序的性能。

 

JavaScript匿名类整理学习笔记的更多相关文章

  1. 《零基础学JavaScript(全彩版)》学习笔记

    <零基础学JavaScript(全彩版)>学习笔记 二〇一九年二月九日星期六0时9分 前期: 刚刚学完<零基础学HTML5+CSS3(全彩版)>,准备开始学习JavaScrip ...

  2. 《JavaScript语言精粹》学习笔记

    一.in的用法 for...in 枚举一个对象的所有可枚举属性 检测DOM/BOM属性 if ("onclick" in elem) { // 元素支持onclick } if ( ...

  3. 《JavaScript权威指南》学习笔记 第六天 开始学习DOM了。

    昨天学习了window对象的一些方法.window对象主要是针对当前视窗的操作.window对象提供了一些列API来帮助我们了解当前窗口的信息.例如history对象可以让我们获取浏览历史.nvaig ...

  4. 《JavaScript高级程序设计》学习笔记12篇

    写在前面: 这12篇博文不是给人看的,而是用来查的,忘记了什么基础知识,点开页面Ctrl + F关键字就好了 P.S.如果在对应分类里没有找到,麻烦告诉我,以便尽快添上.当然,我也会时不时地添点遗漏的 ...

  5. Deep Learning深入研究整理学习笔记五

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  6. python 面向对象(类)--学习笔记

    面向对象是一种编程方式, 主要集中在类和对象的两个概念 python 中的类符合封装, 继承, 多态的特征 类 是一个模板, 是n多函数的集成 对象 是类的实例化 类的成员分为三大类:字段.方法.属性 ...

  7. c#匿名类 anonymous学习

    感谢http://blog.csdn.net/jjx0224/article/details/5887589 感谢http://hi.baidu.com/guodong828/blog/item/cc ...

  8. MVC匿名类传值学习

    刚接触MVC+EF框架不久,但一直很困惑的就是控制器能否及如何向视图传递匿名类数据.宝宝表示很讨厌去新建实体类啦,查询稍有不同就去建一个实体类不是很麻烦吗,故趁阳光正好,周末睡到自然醒后起来尝试了之前 ...

  9. 《JavaScript权威指南》学习笔记 第五天 window对象的方法。

    前天和昨天大致浏览了犀牛书的函数.类与模块.正则表达式.JavaScript扩展.以及服务端的js.这些方面对于我目前的水平来说比较难,一些最基本的概念都不能领会.不过最复杂的知识占用平时使用的20% ...

随机推荐

  1. Generator [ˈdʒenəreɪtə(r)] 函数结构

    Generator函数是ES6新增的一种异步编程方案. 说明:Generator函数指的是一种新的语法结构,是一个遍历器对象生成器,它内部可以封装多个状态,非常适合用于异步操作. Generator函 ...

  2. oracle中如何设置主键并且让其自动增长

    由于oracle中是没有自动增长的的,需要自己去进行写触发器等方式去进行设置: 找了一下他人写的,有两种方法可以设置主键,一种是自增长主键,另一种就是生成唯一序列. 一.自增长主键 我创建一个用户的信 ...

  3. linux(ubuntu) 查看系统设备信息

    ubuntu查看版本命令 方法一: 在终端中执行下列指令: cat /etc/issue 方法二: 使用 lsb_release 命令也可以查看 Ubuntu 的版本号,与方法一相比,内容更为详细. ...

  4. FFmpeg + SDL2 实现的视频播放器「视音频同步」

    文章转自:http://blog.csdn.net/i_scream_/article/details/52760033 日期:2016.10.8 作者:isshe github:github.com ...

  5. Redis总结(二)C#中如何使用redis(转载)

    上一篇讲述了安装redis<Redis总结(一)Redis安装>,同时也大致介绍了redis的优势和应用场景.本篇着重讲解.NET中如何使用redis和C#. Redis官网提供了很多开源 ...

  6. MySQL学习总结(二)数据库以及表的基本操作

    上一节中详细的介绍了关于MySQL数据库的安装过程,接下来我们就该对数据库以及表进行一些基本的操作了. 1.数据类型 MySQL数据库中提供了整数类型.浮点数类型.定点数类型.日期和时间类型.字符串类 ...

  7. 缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename

    一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...

  8. C++中四种类型转换以及const_cast是否能改变常量的问题

    we have four specific casting operators:dynamic_cast, reinterpret_cast, static_cast and const_cast. ...

  9. JNI调用之本地库文件的安装

    在进行JNI调用的时候.是由java的本地接口调用本地库文件来完毕的,可是本地库文件须要放置到指定位置.JNI接口才干调用到,这个路径是由JVM的系统变量"java.library.path ...

  10. @Autowired和@Resource装配

    从Spring2.5開始就能够使用注解自己主动装配Bean的属性. 使用注解自己主动装配与XML中使用autowire属性自己主动装配并没有太大区别. Spring容器默认禁用注解装配. 所以在基于注 ...