博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS开发中函数知识点梳理(三)
阅读量:6227 次
发布时间:2019-06-21

本文共 1733 字,大约阅读时间需要 5 分钟。

这篇文章要介绍的内容是函数表达,因为我个人比较喜欢使用函数表达式定义函数,所以就对它做了一些研究和整理。其实,说到函数表达式,就不得不说到定义函数的另一种方式——函数声明,它们虽然相似,但是又有一些区别,那么它们的区别是什么呢,这个问题会在本文中单独说明,下面进入正文。

函数声明

常见结构如下:

function functionName(arg0, arg1,[...]) {    // 函数体}

由一个关键字 function 开头,后面紧跟函数名,然后是函数的参数(如:(arg0, arg1,[...])),最后是函数体(如:‘{ // 函数体}’)

在JavaScript中,函数声明有一个特性是函数声明的提升,也就是说在代码执行前会先读取函数声明,因此,我们把函数声明放在调用它的语句的前后皆可。

函数表达式

常见结构如下:

var functionName = function(arg0, arg1,[...]) {    // 函数体}

这种创建一个匿名函数,然后将它赋值给变量functionName的表达式形式,就叫做函数表达式。

函数表达式的分类

1.匿名函数表达式

var func = function() {    console.log('I am an anonymous function expression.')}

2.具名函数表达式

var func = function functionname() {    console.log('I am a named function expression.')}

3.自调用函数表达式

(function() {    console.log('I am a self-call function expression.')})()

函数表达式的用法

1.使用 arguments.callee 来接偶函数名和函数体的耦合状态。

function fic(n) {    return n <=1 ? 1 : n * arguments.callee(n-1)}function fic2(n) {    return n <= 1 ? 1 : n * fic(n-1)}function fic3() {    return 0}fic(5)  // 120fic2(5) // 120var fic4 = ficvar fic5 = fic2fic = fic3fic2 = fic3fic(5)  // 0fic2(5) // 0fic4(5) // 120fic5(5) // 0

但是使用 arguments.callee 在严格模式下存在着问题。因此,我们会使用命名函数表达式来解决这个问题。

修改fic函数表达式代码如下:

fic = (function f(n) {    return n <= 1 ? 1 : n * f(n-1)})
  1. 闭包

我们知道,函数表达式是将匿名函数赋值给一个变量,作为变量的值,所以,匿名函数也可以作为return的返回值。

这和闭包的使用是不是很相似。关于闭包的知识点可以参考这篇文章

函数表达式 VS 函数声明

建议先看一下这一篇文章。

这篇文章开始先引用了几个示例来说明,使用函数表达式和函数声明的区别。

  1. 函数声明有一个规则我们应该比较清楚就是函数声明的提升。声明的函数不管在我们调用函数语句之前,还是之后,只要函数声明存在,调用函数就可以执行成功。
  2. 变量的赋值语句,在执行的过程中也存在着变量声明的提升。但是要牢记变量的提升是变量定义的提升,而不是变量赋值的提升,变量赋值还在原来的位置,另外还要记住的是变量定义的提升的同时还会给变量赋值一个初始值为undefined。
  3. 函数表达式和变量的赋值表达式基本类似,只不过函数表达式所赋的值为一个函数。

另外,需要弄明白的一点是JavaScript这门面向对象语言没有重载(拥有相同函数名,但函数的参数不同)这个概念,但是如果后写的代码和前面写的代码定义重复,后面的代码将会覆盖前面代码。

后续可能还会继续修改,也欢迎各位批评指正。有问题或者有其他想法的可以在我的上pr。

转载地址:http://dsxna.baihongyu.com/

你可能感兴趣的文章
ASP.NET MVC 实现多模版的方法
查看>>
Android利用Mediapalyer播放本地资源文件声音
查看>>
MongoDB高级查询用法大全
查看>>
代码整洁之道-第4章-注释-读书笔记
查看>>
单例模式——防止序列化、反序列化以及反射攻击
查看>>
[SequenceFile_1] Hadoop 序列文件
查看>>
不第后赋菊
查看>>
作为程序员容易忽略的一些问题 读《Code Quality :The Open Source Perspective》有感...
查看>>
关于加入收藏的兼容问题
查看>>
UVa 11110 - Equidivisions
查看>>
(一)spring cloud微服务分布式云架构 - Spring Cloud简介
查看>>
伪前端笔记
查看>>
Spark之join、leftOuterJoin、rightOuterJoin及fullOuterJoin
查看>>
20172307 2018-2019-1 《程序设计与数据结构》实验1报告
查看>>
Kafka 0.9 新特性
查看>>
Angualr2 ChartModle图表
查看>>
如何准确高效的获取数据库新插入数据的主键id
查看>>
In-App Purchases验证
查看>>
数据库mysql进阶之路(2)--查询操作
查看>>
解决android模拟器无法上网问题
查看>>