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 相关文章推荐
html读出文本文件内容
Jan 22 Javascript
用jscript实现新建word文档
Jun 15 Javascript
jquery复选框CHECKBOX全选、反选
Aug 30 Javascript
JS图片根据鼠标滚动延时加载的实例代码
Jul 13 Javascript
jquery 页面滚动到指定DIV实现代码
Sep 25 Javascript
javascript中的事件代理初探
Mar 08 Javascript
将HTML格式的String转化为HTMLElement的实现方法
Aug 07 Javascript
JavaScript中join()方法的使用简介
Jun 09 Javascript
javascript实现很浪漫的气泡冒出特效
Sep 05 Javascript
vue.js 表格分页ajax 异步加载数据
Oct 18 Javascript
Bootstrap Table从零开始
Jun 30 Javascript
详解VUE前端按钮权限控制
Apr 26 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 array_search() 函数使用
2010/04/13 PHP
献给php初学者(入门学习经验谈)
2010/10/12 PHP
php引用传值实例详解学习
2013/11/06 PHP
php格式化电话号码的方法
2015/04/24 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
js 禁止选择功能实现代码(兼容IE/Firefox)
2010/04/23 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
JavaScript判断文件上传类型的方法
2014/09/02 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
ionic环境配置及问题详解
2017/06/27 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
python多线程与多进程及其区别详解
2019/08/08 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
Marriott国际:万豪国际酒店查询预订
2017/09/25 全球购物
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
网络安全方面的面试题
2015/11/04 面试题
工程造价自荐信
2013/10/09 职场文书
大学生职业生涯设计书
2014/01/02 职场文书
网站美工岗位职责
2014/04/02 职场文书
爱国演讲稿400字
2014/05/07 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
先进学校事迹材料
2014/12/30 职场文书
承诺书范本
2015/01/21 职场文书
工作证明书
2015/06/15 职场文书
教师节简报
2015/07/20 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP