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 相关文章推荐
电子商务网站上的常用的js放大镜效果
Dec 08 Javascript
解决js下referer兼容各大浏览器的方法
Nov 03 Javascript
JQuery复制DOM节点的方法
Jun 11 Javascript
jquery实现表单输入时提示文字滑动向上效果
Aug 10 Javascript
整理Javascript流程控制语句学习笔记
Nov 29 Javascript
jQuery实现的文字hover颜色渐变效果实例
Feb 20 Javascript
jQuery获取字符串中出现最多的数
Feb 22 Javascript
Ionic如何实现下拉刷新与上拉加载功能
Jun 03 Javascript
js关于getImageData跨域问题的解决方法
Oct 14 Javascript
canvas 绘制圆形时钟
Feb 22 Javascript
打通前后端构建一个Vue+Express的开发环境
Jul 17 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
Jul 19 Javascript
浅谈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
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
smarty的section嵌套循环用法示例
2016/05/28 PHP
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
javascript中String对象的slice()方法分析
2014/12/20 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
老生常谈 关于JavaScript的类的继承
2016/06/24 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
vue的全局变量和全局拦截请求器的示例代码
2018/09/13 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
微信小程序分包加载代码实现方法详解
2019/09/23 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
Python中对列表排序实例
2015/01/04 Python
详细解析Python中的变量的数据类型
2015/05/13 Python
Python3读取zip文件信息的方法
2015/05/22 Python
浅析Python中的for 循环
2016/06/09 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
Python logging管理不同级别log打印和存储实例
2018/01/19 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
Python中py文件转换成exe可执行文件的方法
2019/06/14 Python
python的faker库用法
2019/11/28 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
tensorflow 报错unitialized value的解决方法
2020/02/06 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
String这个类型的class为何定义成final?
2012/11/13 面试题
大学自主招生自荐信
2013/12/16 职场文书
2015年大学生工作总结
2015/04/21 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
浅谈Python中的正则表达式
2021/06/28 Python