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 对象介绍
Jan 20 Javascript
JavaScript对象之间的转换 jQuery对象和原声DOM
Mar 07 Javascript
探讨javascript是不是面向对象的语言
Nov 21 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
Nov 25 Javascript
jQuery满屏焦点图左右滚动特效代码分享
Sep 07 Javascript
JS折半插入排序算法实例
Dec 02 Javascript
jQuery+Ajax实现用户名重名实时检测
Jun 01 jQuery
Vue 父子组件的数据传递、修改和更新方法
Mar 01 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
May 26 Javascript
了解在JavaScript中将值转换为字符串的5种方法
Jun 06 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
Oct 28 Javascript
jquery实现的放大镜效果示例
Feb 24 jQuery
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函数(简单整理)
2010/04/30 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
JS实现支持Ajax验证的表单插件
2016/03/24 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
React Native 使用Fetch发送网络请求的示例代码
2017/12/02 Javascript
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
使用layui定义一个模块并使用的例子
2019/09/14 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
在Python中处理时间之clock()方法的使用
2015/05/22 Python
Python中with及contextlib的用法详解
2017/06/08 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
Python进阶之@property动态属性的实现
2019/04/01 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
Python基于codecs模块实现文件读写案例解析
2020/05/11 Python
建筑毕业生自我鉴定
2013/10/18 职场文书
司马光教学反思
2014/02/01 职场文书
保险公司晨会主持词
2014/03/22 职场文书
学校党的群众路线教育实践活动总结报告
2014/07/03 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
python保存图片的四个常用方法
2022/02/28 Python