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 相关文章推荐
&amp;lt;script defer&amp;gt; defer 是什么意思
May 10 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
Feb 07 Javascript
jQuery统计上传文件大小的方法
Jan 24 Javascript
JavaScript实现把数字转换成中文
Jun 29 Javascript
jquery实现的蓝色二级导航条效果代码
Aug 24 Javascript
Node.js的Web模板引擎ejs的入门使用教程
Jun 06 Javascript
JS把内容动态插入到DIV的实现方法
Jul 19 Javascript
JavaScript里 ==与===区别详解
Aug 16 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
Oct 08 Javascript
JS无限级导航菜单实现方法
Jan 05 Javascript
Vue.extend 编程式插入组件的实现
Nov 18 Javascript
js实现课堂随机点名系统
Nov 21 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
全国FM电台频率大全 - 2 天津市
2020/03/11 无线电
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
JavaScript 变量作用域分析
2011/07/04 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
浅析node.js中close事件
2014/11/26 Javascript
js实现鼠标经过表格行变色的方法
2015/05/12 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
微信小程序自定义音乐进度条的实例代码
2018/08/28 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
javascript实现点击星星小游戏
2019/12/24 Javascript
如何通过javaScript去除字符串两端的空白字符
2020/02/06 Javascript
Vue组件间数据传递的方式(3种)
2020/07/13 Javascript
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
浅谈Python基础之I/O模型
2017/05/11 Python
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
python opencv实现gif图片分解的示例代码
2019/12/13 Python
Django xadmin安装及使用详解
2020/10/26 Python
英国最大的纸工艺品商店:CraftStash
2018/12/01 全球购物
为什么需要版本控制?
2013/08/08 面试题
《郑和远航》教学反思
2014/04/16 职场文书
承诺书范文
2014/06/03 职场文书
医院领导班子四风问题对照检查材料
2014/10/26 职场文书
小学五年级语文上册教学计划
2015/01/22 职场文书
检讨书范文500字
2015/01/28 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python