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 相关文章推荐
对google个性主页的拖拽效果的js的完整注释[转]
Apr 10 Javascript
基于jQuery的投票系统显示结果插件
Aug 12 Javascript
关于JavaScript的面向对象和继承有利新手学习
Jan 11 Javascript
JavaScipt中栈的实现方法
Feb 17 Javascript
Jquery $when done then的用法详解
May 20 Javascript
微信小程序 实战程序简易新闻的制作
Jan 09 Javascript
js处理层级数据结构的方法小结
Jan 17 Javascript
Vue动态组件实例解析
Aug 20 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
Mar 02 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
Feb 21 Javascript
angular 实现下拉列表组件的示例代码
Mar 09 Javascript
使用express获取微信小程序二维码小记
May 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
10个实用的PHP正则表达式汇总
2014/10/23 PHP
PHP内核探索之变量
2015/12/22 PHP
Javascript 阻止javascript事件冒泡,获取控件ID值
2009/06/27 Javascript
js 通用订单代码
2013/12/23 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
阿里云ecs服务器中安装部署node.js的步骤
2016/10/08 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
JS异步执行结果获取的3种解决方式
2019/02/19 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
python数据结构之图的实现方法
2015/07/08 Python
python在不同层级目录import模块的方法
2016/01/31 Python
Windows下搭建python开发环境详细步骤
2020/07/20 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
2019/05/04 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
2020/06/18 Python
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
美国汽车轮胎和轮毂销售网站:Tire Rack
2018/01/11 全球购物
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
秋游活动策划方案
2014/02/16 职场文书
大学毕业感言200字
2014/03/09 职场文书
学校三八妇女节活动情况总结
2014/03/09 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
员工辞退通知书
2015/04/17 职场文书
用Python简陋模拟n阶魔方
2021/04/17 Python
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers