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 浏览器检测代码精简版
Mar 04 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
Aug 29 Javascript
window.onload与$(document).ready()的区别分析
May 30 Javascript
jQuery UI库中dialog对话框功能使用全解析
Apr 23 Javascript
JS for...in 遍历语句用法实例分析
Aug 24 Javascript
jQuery继承extend用法详解
Oct 10 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
Oct 27 Javascript
利用Angularjs中模块ui-route管理状态的方法
Dec 27 Javascript
JavaScript中undefined和null的区别
May 03 Javascript
vue实现鼠标经过动画
Oct 16 Javascript
浅谈Vue中render中的h箭头函数
Nov 07 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
Jan 04 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 反斜杠处理函数addslashes()和stripslashes()实例详解
2016/12/25 PHP
ThinkPHP实现的rsa非对称加密类示例
2018/05/29 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
js中常用的Math方法总结
2017/01/12 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
pycharm执行python时,填写参数的方法
2018/10/29 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
Python 处理图片像素点的实例
2019/01/08 Python
对Python信号处理模块signal详解
2019/01/09 Python
详解pandas安装若干异常及解决方案总结
2019/01/10 Python
关于PyTorch源码解读之torchvision.models
2019/08/17 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
几个MySql的面试题
2013/04/22 面试题
珍惜资源保护环境的建议书
2014/05/14 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
春季运动会开幕词
2015/01/28 职场文书
捐书仪式主持词
2015/07/04 职场文书
个人工作决心书
2015/09/22 职场文书
2016年清明节寄语
2015/12/04 职场文书