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 相关文章推荐
Mootools 1.2教程 设置和获取样式表属性
Sep 15 Javascript
JavaScript isArray()函数判断对象类型的种种方法
Oct 11 Javascript
jquery.post用法示例代码
Jan 03 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
Feb 10 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
Jun 05 Javascript
JavaScript中Null与Undefined的区别解析
Jun 30 Javascript
基于JS代码实现图片在页面中旋转效果
Jun 16 Javascript
js 获取本地文件及目录的方法(推荐)
Nov 10 Javascript
js/jq仿window文件夹框选操作插件
Mar 08 Javascript
浅谈mint-ui loadmore组件注意的问题
Nov 08 Javascript
Vue中使用clipboard实现复制功能
Sep 05 Javascript
详解VUE单页应用骨架屏方案
Jan 17 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
咖啡冲泡指南 咖啡有哪些制作方式 单品咖啡 意式咖啡
2021/03/06 冲泡冲煮
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
Laravel 5.3 学习笔记之 安装
2016/08/28 PHP
PHP如何通过表单直接提交大文件详解
2019/01/08 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
关于js中for in的缺陷浅析
2013/12/02 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
JS简单计算器实例
2015/01/20 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
2016/11/24 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
JS实现图片切换特效
2019/12/23 Javascript
[07:27]DOTA2卡尔工作室 英雄介绍水晶室女篇
2013/06/21 DOTA
python数据结构之二叉树的建立实例
2014/04/29 Python
Python实现测试磁盘性能的方法
2015/03/12 Python
python fabric实现远程部署
2017/01/05 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
Crabtree & Evelyn欧盟:豪华洗浴、身体和护发
2021/03/09 全球购物
采购求职信
2014/03/17 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
体育比赛口号
2014/06/09 职场文书
男性健康日的活动方案
2014/08/18 职场文书
电力安全学习心得体会
2016/01/18 职场文书
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android