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(JQuery)操作Array的相关方法介绍
Feb 11 Javascript
Node.js实用代码段之正确拼接Buffer
Mar 17 Javascript
js拖拽的原型声明和用法总结
Apr 04 Javascript
JS组件Bootstrap Select2使用方法解析
May 30 Javascript
基于Bootstrap实现tab标签切换效果
Apr 15 Javascript
聊一聊Vue.js过渡效果
Sep 07 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
Feb 27 Javascript
详谈JS中数组的迭代方法和归并方法
Aug 11 Javascript
js实现手机web图片左右滑动效果
Dec 29 Javascript
在vue项目中引入高德地图及其UI组件的方法
Sep 04 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
Sep 18 Javascript
v-slot和slot、slot-scope之间相互替换实例
Sep 04 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
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
Javascript倒计时代码
2010/08/12 Javascript
ECMAScript 5中的属性描述符详解
2015/03/02 Javascript
JQuery限制复选框checkbox可选中个数的方法
2015/04/20 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
JavaScript评论点赞功能的实现方法
2017/03/13 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
javascript系统时间设置操作示例
2019/06/17 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
[00:10]DOTA2全国高校联赛 以DOTA2会友
2018/05/30 DOTA
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
Python xlrd excel文件操作代码实例
2020/03/10 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
驴妈妈旅游网:中国新型的B2C旅游电子商务网站
2016/08/16 全球购物
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
物业工作计划书
2014/01/10 职场文书
银行领导证婚词
2014/01/11 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
教师创先争优承诺书
2015/04/27 职场文书
音乐课外活动总结
2015/05/09 职场文书
追悼会答谢词范文
2015/09/29 职场文书
Python实现照片卡通化
2021/12/06 Python