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 相关文章推荐
幻灯片带网页设计中的20个奇妙应用示例小结
May 27 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
Mar 24 Javascript
javascript和jquery修改a标签的href属性
Dec 16 Javascript
jQuery简单动画变换效果实例分析
Jul 04 Javascript
jQuery EasyUI Panel面板组件使用详解
Feb 28 Javascript
JavaScript 巧学巧用
May 23 Javascript
基于vue.js无缝滚动效果
Jan 25 Javascript
Node.js模块全局安装路径配置方法
May 17 Javascript
Vue框架TypeScript装饰器使用指南小结
Feb 18 Javascript
vue计算属性computed的使用方法示例
Mar 13 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
Apr 29 Javascript
layui关闭层级、简单监听的实例
Sep 06 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判断远程url是否有效的几种方法小结
2011/10/08 PHP
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
php页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
2010/07/29 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
jQuery实现简洁的导航菜单效果
2015/11/23 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
2016/12/25 Javascript
jQuery如何跳转到另一个网页 就这么简单
2016/12/28 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
node.js利用mongoose获取mongodb数据的格式化问题详解
2017/10/06 Javascript
JavaScript中Object基础内部方法图
2018/02/05 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
Python编程把二叉树打印成多行代码
2018/01/04 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
python使用epoll实现服务端的方法
2018/10/16 Python
Python基于OpenCV实现人脸检测并保存
2019/07/23 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
基于Pytorch SSD模型分析
2020/02/18 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
应届生人事助理求职信
2013/11/09 职场文书
网吧消防安全制度
2014/01/28 职场文书
怎么写好自荐书
2014/03/02 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
民主评议党员工作总结
2014/10/20 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python