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 相关文章推荐
jQuery弹出层插件简化版代码下载
Oct 16 Javascript
jquery select操作的日期联动实现代码
Dec 06 Javascript
JavaScript 弹出窗体点击按钮返回选择数据的实现
Apr 01 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
Aug 05 Javascript
javascript两种function的定义介绍及区别说明
May 02 Javascript
没有document.getElementByName方法
Aug 19 Javascript
使用JavaScript开发IE浏览器本地插件实例
Feb 18 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
Jun 08 Javascript
JS实现的自定义水平滚动字体插件完整实例
Jun 17 Javascript
微信小程序 倒计时组件实现代码
Oct 24 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
Sep 14 Javascript
ReactRouter的实现方法
Jan 25 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
php mssql 数据库分页SQL语句
2008/12/16 PHP
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
PHP函数getenv简介和使用实例
2014/05/12 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
2015/12/19 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
2010/05/13 Javascript
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
百度判断手机终端并自动跳转js代码及使用实例
2014/06/11 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
python 读取txt中每行数据,并且保存到excel中的实例
2018/04/29 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
2018/10/31 Python
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
焊接专业毕业生求职信
2013/10/01 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
求职信标题怎么写
2014/05/26 职场文书
2014最新版群众路线四风整改措施
2014/09/24 职场文书
2015年招聘工作总结
2014/12/12 职场文书
酒店员工辞职信范文
2015/02/28 职场文书
PHP解决高并发问题
2021/04/01 PHP
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL