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 相关文章推荐
jQuery Select(单选) 模拟插件 V1.3.62 改进版
Jul 17 Javascript
jquery链式操作的正确使用方法
Jan 06 Javascript
JS实现鼠标单击与双击事件共存
Mar 08 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
Nov 09 Javascript
让你一句话理解闭包(简单易懂)
Jun 03 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
Sep 19 Javascript
基于Vuejs框架实现翻页组件
Jun 29 Javascript
详细AngularJs4的图片剪裁组件的实例
Jul 12 Javascript
echart简介_动力节点Java学院整理
Aug 11 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
Nov 03 Javascript
vue实现微信分享功能
Nov 28 Javascript
jQuery实现日历效果
Sep 11 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中删除变量时unset()和null的区别分析
2011/01/27 PHP
PHP计划任务、定时执行任务的实现代码
2011/04/23 PHP
PHP冒泡排序算法代码详细解读
2011/07/17 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
js初始化验证实例详解
2016/11/26 Javascript
jQuery基本筛选选择器实例代码
2017/02/06 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
Python编写一个闹钟功能
2017/07/11 Python
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
Python中flatten( )函数及函数用法详解
2018/11/02 Python
PyQt5实现类似别踩白块游戏
2019/01/24 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
python statsmodel的使用
2020/12/21 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
美国殿堂级滑板、冲浪、滑雪服装品牌:Volcom(钻石)
2017/04/20 全球购物
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
企业管理培训感言
2014/01/27 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python
MySQL sql_mode的使用详解
2021/05/08 MySQL
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python