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 相关文章推荐
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
May 08 Javascript
仅img元素创建后不添加到文档中会执行onload事件的解决方法
Jul 31 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
Apr 02 Javascript
javascript判断机器是否联网的2种方法
Aug 09 Javascript
jquery中插件实现自动添加用户的具体代码
Nov 15 Javascript
jquery使用ul模拟select实现表单美化的方法
Aug 18 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
Aug 09 Javascript
js单页hash路由原理与应用实战详解
Aug 14 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
Sep 04 Javascript
微信小程序仿美团城市选择
Jun 06 Javascript
详解Vue.js中引入图片路径的几种方式
Jun 17 Javascript
实现vuex与组件data之间的数据同步更新方式
Nov 12 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 之Section与Cookie使用总结
2012/09/14 PHP
PHP根据IP地址获取所在城市具体实现
2013/11/27 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
JavaScript 函数调用规则
2009/09/14 Javascript
jquery下实现overlay遮罩层代码
2010/08/25 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
BootStrap使用file-input插件上传图片的方法
2016/09/05 Javascript
JS访问DOM节点方法详解
2016/11/29 Javascript
Bootstrap CSS布局之表格
2016/12/17 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
Python网络编程使用select实现socket全双工异步通信功能示例
2018/04/09 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
python算法题 链表反转详解
2019/07/02 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
多个python文件调用logging模块报错误
2020/02/12 Python
HTML5注册页面示例代码
2014/03/27 HTML / CSS
七匹狼男装广告词
2014/03/21 职场文书
物理教育专业求职信
2014/06/25 职场文书
毕业生个人总结
2015/02/28 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
初中家长意见
2015/06/03 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
导游词之无锡古运河
2019/11/14 职场文书
HTML基础详解(上)
2021/10/16 HTML / CSS
Linux中文件的基本属性介绍
2022/06/01 Servers