javascript 函数声明与函数表达式的区别介绍
发布时间:2024-04-23 09:08:50
还是一样,先上代码:
<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的花括号解析成表达式而不是代码块。
猜你喜欢
- 脚本运行环境python 3.6+edge浏览器(推荐使用,因为在edge浏览器中可以获得额外12分,当然chrome浏览器也可以)webd
- 基于python的Appium进行b站直播消费记录爬取之前看文章说fiddler也可以进行爬取,但尝试了一下没成功,这次选择appium进行
- Check In/Out功能简介:该功能是专门针对多用户管理而预设的。即多用户使用多帐号管理同一站点。
- 目录selenium模块selenium基本概念基本使用基于浏览器自动化的操作selenium处理iframe:selenium模拟登陆QQ
- 使用python爬虫库requests,urllib爬取今日头条街拍美图代码均有注释import re,json,requests,osfr
- 需求我在最近的一个任务中,存在一个redis高并发计算多个客户端接收预警信息的时长问题。模型是首先模拟多个客户端连接预警服务器集群,然后向预
- 前言 日益增长的分布式应用需求要求实现更好分布式的软件环境,不断推动着分布式技术的进步。Oracle数据复制是实现分布式数据环境的一种技术,
- 1.建表脚本1.1.建表DROP TABLE IF EXISTS `sys_region`;CREATE TABLE `sys_region
- 一、检查系统版本[root@node ~]# cat /etc/os-release NAME="CentOS Linux&quo
- 一、获取安装包最近的版本为0.4.12,下载地址:http://sourceforge.net/projects/sysbench/二、编译
- 正在看的ORACLE教程是:自动备份Oracle数据库。
- 本文实例讲述了PHP使用星号隐藏用户名,手机和邮箱的实现方法。分享给大家供大家参考,具体如下:PHP使用星号替代用户名手机和邮箱这个在许多的
- import Exception# except 在捕获错误异常的时候 是要根据具体的错误类型来捕获的# 用一个块 可以捕获多个不同类型的异
- 动机一些bug由于本地环境和线上环境的不一致可能导致本地无法复现本地依赖和线上依赖版本不一致也可以导致一些问题有时一些bug跟数据相关,本地
- 本文实例讲述了Python编程实现的简单Web服务器。分享给大家供大家参考,具体如下:最近有个需求,就是要创建一个简到要多简单就有多简单的w
- 目录mysql主从复制mysql主从复制的方式mysql主从复制的原理mysql的主从配置的具体实现方式1、 Master配置2、 Slav
- 好难受,上次发了做游戏的居然没人看,每天为了给你们写啥,老夫心都操碎了~真的是,今天来给大家爬一波短视频网站吧,都是些很养眼的~网站地址在代
- 一、前言:mysql8之后想比起之前常用的版本改动还是挺大的,因为刚从安装接触,就先从基本的说起。现在的mysql8安装只能采用解压配置版,
- 概述binlog2sql是一个Python开发开源的MySQL Binlog解析工具,能够将Binlog解析为原始的SQL,也支持将Binl
- datetime的astimezone设置时区遇到的坑datetime有四个主要的模块:1、date 处理年、月、日。2、time 处理时、