javascript 函数声明与函数表达式的区别介绍


Posted in Javascript onOctober 05, 2013

还是一样,先上代码:

<script> 
var f = function g() { 
return 1; 
}; 
if (false) { 
f = function g(){ 
return 2; 
}; 
} 
alert(g()); // 2 
</script>

把这段代码扔到IE 6 里面和chorme里面是完全不同的两种效果。

这里输出2 是在ie6里面的效果,如果在chorme会出现g没有定义。

这也算是JScript的bug吧。

在这里很明显,这里的只是定义了g的函数表达式而已。包括在if的条件语句中,也只是定义了函数表达式,没有去声明函数。

那么这样直接访问肯定是会出错的。

那么对于何为声明,何为函数表达式呢?

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

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

函数表达式:

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

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

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

你可能会想到,在使用eval对JSON进行执行的时候,JSON字符串通常被包含在一个圆括号里:eval('(' + json + ')'),这样做的原因就是因为分组操作符,也就是这对括号,会让解析器强制将JSON的花括号解析成表达式而不是代码块。

Javascript 相关文章推荐
javascript中检测变量的类型的代码
Dec 28 Javascript
EditPlus注册码生成器(js代码实现)
Mar 25 Javascript
jQuery的观察者模式详解
Dec 22 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
Feb 18 Javascript
jQuery实现简单的手风琴效果
Apr 17 jQuery
vue 使用Jade模板写html,stylus写css的方法
Feb 23 Javascript
深入浅析JS中的严格模式
Jun 04 Javascript
Jquery的autocomplete插件用法及参数讲解
Mar 12 jQuery
简单易扩展可控性强的Jquery转盘抽奖程序
Mar 16 jQuery
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
Oct 25 Javascript
javascript实现超好看的3D烟花特效
Jan 01 Javascript
浅谈Ant Design Pro 菜单自定义 icon
Nov 17 Javascript
javascript自启动函数的问题探讨
Oct 05 #Javascript
纯js简单日历实现代码
Oct 05 #Javascript
JS教程:window.location使用方法的区别介绍
Oct 04 #Javascript
js中单引号与双引号冲突问题解决方法
Oct 04 #Javascript
jquery parent和parents的区别分析
Oct 02 #Javascript
jQuery插件 selectToSelect使用方法
Oct 02 #Javascript
jquery定时滑出可最小化的底部提示层特效代码
Oct 02 #Javascript
You might like
php中的strpos使用示例
2014/02/27 PHP
微信公众号开发之文本消息自动回复php代码
2016/08/08 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
jquery实现点击变换导航样式的方法
2015/08/31 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
Nodejs调用WebService的示例代码
2017/09/29 NodeJs
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
Python发送Email方法实例
2014/08/21 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
python+opencv实现动态物体识别
2018/01/09 Python
Python实现生成密码字典的方法示例
2019/09/02 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
小孩百日宴答谢词
2014/01/15 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
投标承诺函格式
2015/01/21 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
论文致谢词范文
2015/05/14 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书