JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同


Posted in Javascript onNovember 15, 2015

函数表达式和函数声明

在ECMAScript中,创建函数的最常用的两个方法是函数表达式和函数声明,两者期间的区别是有点晕,因为ECMA规范只明确了一点:函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符:

函数声明:

function 函数名称 (参数:可选){ 函数体 }

函数表达式:

function 函数名称(可选)(参数:可选){ 函数体 }

所以,可以看出,如果不声明函数名称,它肯定是表达式,可如果声明了函数名称的话,如何判断是函数声明还是函数表达式呢?ECMAScript是通过上下文来区分的,如果function foo(){}是作为赋值表达式的一部分的话,那它就是一个函数表达式,如果function foo(){}被包含在一个函数体内,或者位于程序的最顶部的话,那它就是一个函数声明。

function foo(){} // 声明,因为它是程序的一部分
 var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分
 new function bar(){}; // 表达式,因为它是new表达式
 (function(){
  function bar(){} // 声明,因为它是函数体的一部分
 })();

还有一种函数表达式不太常见,就是被括号括住的(function foo(){}),他是表达式的原因是因为括号 ()是一个分组操作符,它的内部只能包含表达式,我们来看几个例子:

  function foo(){} // 函数声明
  (function foo(){}); // 函数表达式:包含在分组操作符内

命名函数表达式

提到命名函数表达式,理所当然,就是它得有名字,前面的例子var bar = function foo(){};就是一个有效的命名函数表达式,但有一点需要记住:这个名字只在新定义的函数作用域内有效,因为规范规定了标示符不能在外围的作用域内有效:

var f = function foo(){
  return typeof foo; // foo是在内部作用域内有效
 };
 // foo在外部用于是不可见的
 console.log(typeof foo); // "undefined"
 console.log(f()); // "function"
var f = function foo(){
return foo; // foo是在内部作用域内有效
};
// foo在外部用于是不可见的
console.log(typeof foo); // "undefined"
console.log( f()==f); // "function"
console.log(f.name);//foo

既然,这么要求,那命名函数表达式到底有啥用啊?为啥要取名?

正如我们开头所说:给它一个名字就是可以让调试过程更方便,因为在调试的时候,如果在调用栈中的每个项都有自己的名字来描述,那么调试过程就太爽了,感受不一样嘛。

ps:JS中函数声明与函数表达式的不同

Js中的函数声明是指下面的形式:

function functionName(){ 
}

这样的方式来声明一个函数,而函数表达式则是类似表达式那样来声明一个函数,如:

var functionName = function(){ 
}

可能很多朋友在看到这两一种写法时会产生疑惑,这两种写法差不多,在应用中貌似也都是可行的,那他们有什么差别呢?

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

Javascript 相关文章推荐
javascript eval(func())使用示例
Dec 05 Javascript
JavaScript中判断整数的多种方法总结
Nov 08 Javascript
简介JavaScript中setUTCSeconds()方法的使用
Jun 12 Javascript
JavaScript重定向URL参数的两种方法小结
Oct 19 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
Dec 02 Javascript
利用Query+bootstrap和js两种方式实现日期选择器
Jan 10 Javascript
详解JS构造函数中this和return
Sep 16 Javascript
vue实现前进刷新后退不刷新效果
Jan 26 Javascript
vue中设置height:100%无效的问题及解决方法
Jul 27 Javascript
CKEditor4配置与开发详细中文说明文档
Oct 08 Javascript
全面解析JavaScript Module模式
Jul 24 Javascript
jquery实现图片放大镜效果
Dec 23 jQuery
浅谈JavaScript中的对象及Promise对象的实现
Nov 15 #Javascript
javascript 中的 delete及delete运算符
Nov 15 #Javascript
详解JavaScript函数对象
Nov 15 #Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
Nov 15 #Javascript
深入浅析JavaScript中prototype和proto的关系
Nov 15 #Javascript
apply和call方法定义及apply和call方法的区别
Nov 15 #Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
Nov 15 #Javascript
You might like
CentOS 6.3下安装PHP xcache扩展模块笔记
2014/09/10 PHP
JavaScript实现禁止后退的方法
2006/12/27 Javascript
cssQuery()的下载与使用方法
2007/01/12 Javascript
js no-repeat写法 背景不重复
2009/03/18 Javascript
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
Javascript调用C#代码
2011/01/17 Javascript
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
JS常见问题整理(持续更新)
2013/08/06 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
vue 中固定导航栏的实例代码
2019/11/01 Javascript
kaggle+mnist实现手写字体识别
2018/07/26 Python
keras中的loss、optimizer、metrics用法
2020/06/15 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
一套Delphi的笔试题一
2016/02/14 面试题
大四学生思想汇报
2014/01/13 职场文书
鲜花方阵解说词
2014/02/13 职场文书
酒店七夕情人节活动策划方案
2014/08/24 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
公务员个人考察材料
2014/12/23 职场文书
六一儿童节开幕词
2015/01/29 职场文书
莫言诺贝尔获奖感言(全文)
2015/07/31 职场文书
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL
JavaScript ES6的函数拓展
2022/01/18 Javascript