相同点

注:函数声明和函数表达式的相同点包括但不限于以下几点

  1. 函数是一个值,所以和其他值一样,函数也可以进行被输出、被赋值、作为参数传给其他函数等相关操作,不管函数是以什么方式被定义的,当然和其他值的输出还是有些区别的。

    我们先来输出这个值:

    function nameAlert(name){
    alert('博主的名字是:' + name + ' 。');
    }
    alert(nameAlert);
    注意输出的结果并不是1,而是这个函数的整个源代码,即输出结果为: function nameAlert(name){
    alert('博主的名字是:' + name + ' 。');
    }
  2. 作为参数传给其他函数。

    function nameAlert(name){
    alert('博主的名字是:' + name + ' 。');
    }
    var anotherNameAlert=nameAlert;
    anotherNameAlert('myvin');

    该例子中将函数nameAlert作为参数传给了anotherNameAlert,然后anotherNameAlert也指向了该函数。

    这里就涉及到了函数的传递,函数的传递是传引用,就是说函数存在内存中的某个位置,nameAlertanotherNameAlert是都是函数的一个引用,把函数名nameAlert赋值给anotherNameAlert的时候,它们引用的都是同一个函数。

    所以anotherNameAlert的输出结果为:

    博主的名字是:myvin 。

当然函数还有其他特点,在此不再介绍,感兴趣的可以自己总结下。

不同点

注:函数声明和函数表达式的不同点包括但不限于以下几点

相对函数声明和函数表达式之间的相同点,它们的不同点更应该值得我们关注。下面我结合自己的理解聊聊。

  1. 函数声明必须有标识符,也就是常说的函数名;函数表达式可以省略函数名。

    关于它们的定义的不同小伙伴们应该都知道,我们简单重复一遍。

    如下:

    函数声明(要带标识符)

    function functionName(arg1, arg2, ...){
    <!-- function body -->
    }

    函数表达式

    • 省略标识符

      var  variable=function(arg1, arg2, ...){
      <!-- function body -->
      }
    • 带有标识符

      var  variable=function functionName(arg1, arg2, ...){
      <!-- function body -->
      }
  2. 函数声明会提前

    函数声明是在预执行期执行的,就是说函数声明是在浏览器准备执行代码的时候执行的。因为函数声明在预执行期被执行,所以到了执行期,函数声明就不再执行(人家都执行过了自然就不再执行了)。

    例子的话还是前文的说真话函数:

    sayTruth();<!-- 函数声明 -->
    function sayTruth(){
    alert('myvin is handsome.');
    } sayTruth();<!-- 函数表达式 -->
    var sayTruth=function(){
    alert('myvin is handsome.');
    }

    即函数声明的话sayTruth()可以提前调用,就是不请自来的那种,而函数表达式是什么时候遇到什么时候执行。

    函数声明提前是它们很大的一个不同点,理解这一点对于我们函数的应用有很大帮助,能使我们避免一些错误。

  3. ECMAScript规范中表示,函数声明语句可以出现在全局代码中,或者内嵌在其他函数中,但是不能出现在循环、条件判、或者try/finally以及with语句中。

    对于这条,可能会有所疑问:“上文不是有一个函数声明出现在if循环中的么”。的确是这样,但是规定下发了,遵守不遵守就是另一回事了。JavaScript对于这条规范的实现并不是严格遵守的,FF中允许if中出现函数声明。

    但不管规范怎么样,造成这样的原因还是函数声明提前。

    还是引用上文的例子和说明:

    sayTruth();
    if(1){
    function sayTruth(){alert('myvin is handsome')};
    }
    else{
    function sayTruth(){alert('myvin is ugly')};
    }

    为什么呢?当然是声明提前了。因为函数声明提前,所以函数声明会在代码执行前进行解析,执行顺序是这样的,先解析function sayTruth(){alert('myvin is handsome')},在解析function sayTruth(){alert('myvin is ugly')},覆盖了前面的函数声明,当我们调用sayTruth()函数的时候,也就是到了代码执行期间,声明会被忽略,所以自然会输出myvin is ugly

  4. 可以创建一个函数表达式即刻执行。

    (function(){
    alert('博主的名字是:myvin 。');
    })()

    这样可以使得全局变量不受局部变量的影响,保持全局的干净。注意,括号里面的是表达式。

事实上,js的解析器对函数声明与函数表达式并不是一视同仁地对待的。对于函数声明,js解析器会优先读取,确保在所有代码执行之前声明已经被解析,而函数表达式,如同定义其它基本类型的变量一样,只在执行到某一句时也会对其进行解析,所以在实际中,它们还是会有差异的,具体表现在,当使用函数声明的形式来定义函数时,可将调用语句写在函数声明之前,而后者,这样做的话会报错。

参考链接:http://www.cnblogs.com/myvin/p/4649789.html

http://blog.csdn.net/one_and_only4711/article/details/6361131

JS中函数声明与函数表达式的异同的更多相关文章

  1. JS中函数声明与函数表达式的不同

    Js中的函数声明是指下面的形式: function functionName(){   } 这样的方式来声明一个函数,而函数表达式则是类似表达式那样来声明一个函数,如 var functionName ...

  2. JS中的函数声明和函数表达式的区别,即function(){}和var function(){},以及变量提升、作用域和作用域链

    一.前言 Uncaught TypeError: ... is not a function function max(){}表示函数声明,可以放在代码的任何位置,也可以在任何地方成功调用: var ...

  3. JS的一些总结(函数声明和函数表达式的区别,函数中的this指向的问题,函数不同的调用方式,函数也是对象,数组中的函数调用)

    一.函数声明和函数表达式的区别: 函数声明放在if——else语句中,在IE8中会出现问题 函数表达式则不会 <script> if(true){ function f1(){ conso ...

  4. js中的函数声明和函数表达式的区别

    目录 一.声明与表达式的格式 1.1 声明式的格式: 1.2 表达式的格式: 二.区别 2.1 函数表达式可以直接在后面加括号执行,而函数声明不可以. 2.2 函数表达式可以被提前解析出来 2.3 命 ...

  5. Js中函数声明和函数表达式的区别

    先看以下几段烧脑的代码: f();//=>? var f = function () { console.log("var"); } function f() { conso ...

  6. js函数声明和函数表达式的区别

    Javascript Function无处不在,而且功能强大!通过Javascript函数可以让JS具有面向对象的一些特征,实现封装.继承等,也可以让代码得到复用.但事物都有两面性,Javascrip ...

  7. 转载 js函数声明和函数表达式

    在js中函数有两种表达方式.1 函数声明 2 函数表达式 函数声明 function sayname(){ alert("li lei"); } 函数表达式 var sayname ...

  8. JavaScript(js)函数声明与函数表达式的区别

    在JavaScript中,函数是经常用到的,在实际开发的时候,我想很多人都没有太在意函数的声明与函数表达式的区别,但是呢,这种细节的东西对于学好js是非常重要的. 函数声明与函数表达式用代码写出来是这 ...

  9. 【JS】函数提升变量提升以及函数声明和函数表达式的区别

    今天看js的变量提升问题,里面提到了函数提升.然后发现自己之前一直把函数声明和函数表达式弄错,导致函数提升出错 一.变量提升 console.log(a) var a=100 //undefined ...

随机推荐

  1. [svc][op]磁盘MBR分区机制- inode/Block深入实战

    一 思路: 1,磁盘物理结构及大小计算 2,分区 MBR GPT知识 3,fdisk分区 挂载 自动挂载 4,格式化文件系统 5,inode block 6,软硬链接 查看磁盘: [root@moba ...

  2. 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...

  3. SourceInsight自定义常用快捷键

    1.快速显示文件大纲,类似于eclipse中的Ctrl+O: “Options”-"Key Assignments"-"Symbol: Browse Local File ...

  4. [转] 职业规划:一个老鸟眼中“IT民工”的发展方向

    IT行业“挣钱太容易”,“IT不像政府管房产这么严,想干嘛就干嘛,另外都跑到境外去上市,没干两年市值翻好多倍,利润比地产高出几十倍几千倍,我们投入10块钱赚1块钱,IT行业投入10块钱赚1000块钱, ...

  5. sublime php插件

    1. Package Control Get Package Control here. 2. Theme - Phoenix   and  Flatland(扁平) If Sublime Text ...

  6. jQuery的使用说明

    jQuery是一款同prototype一样优秀js开发库类,特别是对css和XPath的支持,使我们写js变得更加方便!如果你不是个js高手又想写出优 秀的js效果,jQuery可以帮你达到目的!   ...

  7. singer页左侧滚动的时候右侧跟随高亮显示

    1.封装scroll.vue的listenScroll属性和方法,用来确定监听listview.vue的滚动事件 2.将listview.vue的listenScroll属性默认设置为true; 3. ...

  8. 使用eclipse kepler,结果getServletContext可用了

    奇怪,我既没有更新JDK也没有更新Tomcat,仅仅是把eclipse换成了kepler,在JSP中getServletContext就可以用了,可能是因为eclipse自身带的JRE更新了API吧

  9. RabbitMQ(二):mandatory标志的作用

    本文转自:http://m.blog.csdn.net/article/details?id=54311277 在生产者通过channel的basicPublish方法发布消息时,通常有几个参数需要设 ...

  10. MySQL数据类型和运算符

    mysql支持多种数据类型,主要有下面三种: 数值数据类型 日期/时间类型 字符串类型 整数类型 不同数据类型有不同的取值范围,可存储的值的范围越大,则所需的存储空间也越大. 整数类型主要有: tin ...