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 相关文章推荐
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
Jul 08 Javascript
动态读取JSON解析键值对的方法
Jun 03 Javascript
js实现用户注册协议倒计时的方法
Jan 21 Javascript
JavaScript实现16进制颜色值转RGB的方法
Feb 09 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
Dec 07 Javascript
BootStrap实用代码片段之一
Mar 22 Javascript
JS表格组件神器bootstrap table详解(强化版)
May 26 Javascript
React快速入门教程
Jan 17 Javascript
原生js开发的日历插件
Feb 04 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
Dec 25 Javascript
Vue源码解析之Template转化为AST的实现方法
Dec 14 Javascript
React 并发功能体验(前端的并发模式)
Jul 01 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高效率写法(详解原因)
2013/06/20 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
php查找指定目录下指定大小文件的方法
2014/11/28 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
PHP时间处理类操作示例
2018/09/05 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
jQuery autocomplete插件修改
2009/04/17 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
2015/12/29 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
2017/05/05 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
微信小程序 本地图片按照屏幕尺寸处理
2017/08/04 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
[08:08]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY
2014/06/25 DOTA
[00:12]DAC2018 天才少年转战三号位,他的SOLO是否仍如昔日般强大?
2018/04/06 DOTA
Python将多份excel表格整理成一份表格
2018/01/03 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
python中树与树的表示知识点总结
2019/09/14 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
用CSS3的box-reflect设置文字倒影效果的方法讲解
2016/03/07 HTML / CSS
Solid & Striped官网:美国泳装品牌
2019/06/19 全球购物
JPA的优势都有哪些
2013/07/04 面试题
国际贸易专业个人求职信格式
2014/02/02 职场文书
理财计划书
2014/08/14 职场文书
2014年学校团委工作总结
2014/12/20 职场文书
趣味运动会简讯
2015/07/20 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书
自考生自我评价
2019/06/21 职场文书
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers