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 相关文章推荐
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
Jan 13 Javascript
Jquery实现带动画效果的经典二级导航菜单
Mar 22 Javascript
JS基于面向对象实现的放烟花效果
May 07 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
Nov 15 Javascript
Sortable.js拖拽排序使用方法解析
Nov 04 Javascript
JS扩展类,克隆对象与混合类实例分析
Nov 26 Javascript
详解使用fetch发送post请求时的参数处理
Apr 05 Javascript
jQuery实现的点击按钮改变样式功能示例
Jul 21 jQuery
Webpack按需加载打包chunk命名的方法
Sep 22 Javascript
详解Vue3中对VDOM的改进
Apr 23 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
Jul 26 Javascript
Vue elementui字体图标显示问题解决方案
Aug 18 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与mysql建立连接并执行SQL语句的代码
2011/07/04 PHP
php中用date函数获取当前时间有误的解决办法
2013/08/02 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
javascript定时变换图片实例代码
2013/03/17 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
jQuery动态添加
2016/04/07 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
[47:08]OG vs INfamous 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
python读取与写入csv格式文件的示例代码
2017/12/16 Python
django使用admin站点上传图片的实例
2019/07/28 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
英国最受欢迎的在线隐形眼镜商店:VisionDirect.co.uk
2018/12/06 全球购物
英国领先的名牌服装折扣零售商:Brown Bag Clothing
2019/01/08 全球购物
打架检讨书400字
2014/01/17 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server
MySQL中一条update语句是如何执行的
2022/03/16 MySQL