文档章节

js 函数定义和函数表达式的区别

L
 LorinLuo
发布于 2015/12/09 13:49
字数 672
阅读 39
收藏 1

Javascript中有2个语法都与function关键字有关,分别是:

函数定义:function FunctionName(FormalParameterList) { FunctionBody }

函数表达式:function [FunctionName](FormalParameterList) { FunctionBody }

从语法的定义上看,这两者几乎是一模一样的(唯一的区别是函数表达式可以省略函数名称),那么就解释器而言,当遇到这个结构的语句时,判定为函数表达式还是函数定义呢?

就javascript的语法而言,如果一条语句是以function关键字开始,那么这段会被判定为函数定义。而函数定义是不能被立即执行的,这无疑会导致语法的错误(SyntaxError),因此就必须有一个办法,使解析器可以将之识别为函数表达式。

前面已经说到,解析器识别函数定义的条件是以function关键字开始,那么自然,只要在function关键字的前面有任何其他的元素,就会从函数定义转变为函数表达式,以下方法都是可以的,这个大家都知道:

~function() {}();

!function() {}();

void function() {}();

但是这几个方法都有一个特点,就是看起来很别扭,所以现在为止,以括号包裹成了比较公认的方案

回到正题,括号包裹同样有2个方式:(function() {})();和(function(){}());

他们的共通点是:都有括号。而括号在javascript中有2种作用:确立运算优先级,以及分组运算符,从代码上看,显然没有进行数学或逻辑运算,因此我认为这里的括号属于分组运算符。

根据标准,分组运算符的作用是:

Return the result of evaluating Expression. This may be of type Reference. 

返回评估括号中的表达式的结果。结果可能是Reference类型。

抛开像Reference类型这种词汇,这里的一个关键词应当是“ 评估 ”,但是关于分组运算符,又有一个很重要的下文:

This algorithm does not apply GetValue to the result of evaluating Expression.

这个算法不会对估算的结果使用GetValue。

有很多专用的名词,看起来确实复杂,简而言之,使用括号运算符本身不会让括号中的代码立即执行,只有当括号包含的这个“分组”参与其他运算时,才会执行。因此,(function(){})()这个语句,其实是首先用分组运算符评估了一个函数表达式,随后参与“函数调用”。而(function(){}())这个语句,则是用分组运算符评估了一个函数调用,随后由于语句的结束而被执行。


© 著作权归作者所有

上一篇: js 设计模式
下一篇: 弹性盒模型(flex)
L
粉丝 18
博文 166
码字总数 116776
作品 0
成都
程序员
私信 提问
简析JavaScript中的Function类型(二)——函数声明与函数表达式的区别

在简析JavaScript中的Function类型(一)——函数名是指针中我们提到函数有三种定义方式:函数声明、函数表达式、使用构造函数。其中,函数声明和函数表达式是比较常用的方式,本篇文章就来讲...

Bob2100
03/09
10
0
关于javaScript的认识

NaN与Infinity和-Infinity不同的是,NaN不会与任何数值变量相等,可以用javaScript专门提供的isNaN()函数来判断某个变量是否为NaN。 Undefined类型的值只有undefined一个,该值用于表示某个变...

杨松坤
2012/05/09
225
0
JavaScript终极BOSS_函数

你确定掌握了JS的函数,真的确定吗? 警告:最后一站:秋名山,座下乃AE86,无法保证不撒豆腐,路途颠簸刺激,请务必拉好扶手! JavaScript函数 函数过于恶心,我们由浅入深,一点一点来,相...

风蓝小栖
2018/08/08
0
0
《JavaScript 权威指南》读书笔记 1 - 简介

原文:https://keelii.github.io/2016/06/16/javascript-definitive-guide-note-0/ 第一章 主要介绍 JavaScript 的大概情况、基本语法。之前没有 JavaScript 基础的看不懂也没关系,后续章节...

keelii
2016/06/24
0
0
为 JavaScript 开发人员准备的 Dart 参考教程

Dart 是 Flutter 主要的开发语言,这一篇文章主要为 JavaScript 开发人员准备的 Dart 教程,我会用很详细的对比来参考,力争 JavaScript 开发人员可以快速的熟练使用 Dart,为使用 Flutter ...

奇舞周刊
01/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
8
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部