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 FormatNumber函数实现方法
Dec 30 Javascript
JS 日期验证正则附asp日期格式化函数
Sep 11 Javascript
Javascript中的isNaN函数使用说明
Nov 10 Javascript
jquery移动listbox的值原理及代码
May 03 Javascript
JS截取字符串常用方法整理及使用示例
Oct 18 Javascript
JQuery.validate在ie8下不支持的快速解决方法
May 18 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
Jun 12 Javascript
详细解读Jquery各Ajax函数($.get(),$.post(),$.ajax(),$.getJSON())
Aug 15 Javascript
Html5+jQuery+CSS制作相册小记录
Dec 30 Javascript
过期软件破解办法实例详解
Jan 04 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
Feb 10 Javascript
Openlayers学习之地图比例尺控件
Sep 28 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
PHP使用feof()函数读文件的方法
2014/11/07 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
js 表单提交后按钮变灰的实例代码
2013/08/16 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
AngularJS中的作用域实例分析
2018/05/16 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
[01:29:31]VP VS VG Supermajor小组赛胜者组第二轮 BO3第一场 6.2
2018/06/03 DOTA
python僵尸进程产生的原因
2017/07/21 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
python socket 聊天室实例代码详解
2019/11/14 Python
Python下载的11种姿势(小结)
2020/11/18 Python
python-地图可视化组件folium的操作
2020/12/14 Python
python matlab库简单用法讲解
2020/12/31 Python
阿联酋电子产品购物网站:Menakart
2017/09/15 全球购物
建龙钢铁面试总结
2014/04/15 面试题
会计自我鉴定范文
2013/10/06 职场文书
经管应届生求职信
2013/11/17 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
试用期自我评价怎么写
2015/03/10 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL