JS中,函数原来有这么多种定义方法

简介: 最近在期末与暑假假期画饼之间不断奔波,很长时间没有记录了,今天在学习的时候看到了ES6的箭头函数,瞬间找到了写文的动力,那就来梳理一下在JavaScript中一共有几种定义函数的方式吧,最后再(微微)重点的介绍一下箭头函数✨过段时间,要加强算法学习了,这段时间也在力扣和牛客上找题做了一下,发现自己的算法真的烂,所以可能以后还会把算法题解写一写。(🍗+ 1)

前言

最近在期末与暑假假期画饼之间不断奔波,很长时间没有记录了,今天在学习的时候看到了ES6的箭头函数,瞬间找到了写文的动力,那就来梳理一下在JavaScript中一共有几种定义函数的方式吧,最后再(微微)重点的介绍一下箭头函数✨

过段时间,要加强算法学习了,这段时间也在力扣和牛客上找题做了一下,发现自己的算法真的烂,所以可能以后还会把算法题解写一写。(🍗+ 1)

JavaScript定义函数的几种方式

以下是定义函数的几种方式,真正书写的话,个人觉得没有什么必须要用某种格式的情况,根据团队风格或者个人习惯来就好。

最初的我们

我们刚接触js的时候,见到的就是它啦😎

function hello () {
    console.log('hello javascript');
}
hello();

这种方式大概也是陪伴我们时间最长的了吧?是不是呢?

函数表达式

函数都是Function的实例对象,也就可以说函数是值,与字符串,数字等是一样的。这种方法就是通过表达式来定义函数,也就是定义匿名函数,再将匿名函数交给变量。

var hello = function () {
    console.log('hello javascript');
}
hello();

对象方法

这种方法大家应该也都见过,它是定义匿名函数来作为对象属性的值,与函数表达式的理念相同。这种形式最早是在ES3中引入的。

let obj = {
    fun: function() {},
}

ES5中,引入了访问器属性定义:

let obj = {
    get name() {},
    set name(name) {}
}

看到get/set是不是感觉跟Java的类有一点像了,没错我也有这种感觉,继续往下看,类它来了!

在ES6中,有了类的概念(学过java的小伙伴们一定不会陌生),没错,js中也有类,而且也有构造方法等一些与Java类一样的东西。

class Demo{
    constructor(){
        this.fun=()=>{
            console.log('实例方法')
        }
        console.log('构造方法');
    }
    static jingtai(){
        console.log('静态方法');
    }
    yuanxingfangfa(){
        console.log('原型方法')
    }
}
  • 实例方法:定义在构造方法constructor中的this对象上,在类中,构造方法中的this指的是它的实例对象
  • 原型方法:与constructor方法同级,可以通过构造函数的原型链去调用,也可以通过实例对象来调用
  • 静态方法:通过static关键字定义,不能被实例调用,可以被构造函数调用。

箭头函数

终于到了我们这次文章的主角登场啦~ 我去网上查了一些资料,浏览了CSDN和掘金的一些博客社区,很多人都觉得,它是ES2015最具有争议性的函数之一,但是它如今也已经变得众所周知,无处不在。它为函数声明提供了两种不同的格式,赋值表达式(箭头后无大括号"{}")和函数体(代码种包括0到多个语句时)。这个语法还允许在描述单个参数的时候不加圆括号,0个或者1个以上的时候要加圆括号。这些语法结构允许箭头函数有着多种书写格式。

// 无参的赋值表达式
(() => 2*2);

// 一个参数,忽略括号的赋值表达式
(x => x*2);
// 一个参数,忽略括号直接跟函数体
(x => { return x *2 });

// 括号中为参数列表和赋值表达式
((x,y) => x*y);

来稍微解释一下箭头函数

x => x * 2;

等价于:

function (x) {
    return x * 2;
}

箭头函数相当于匿名函数,并且简化了函数定义,使用起来非常的方便。

但是使用箭头函数,我们要注意以下几点:

  • 箭头函数是没有this的,它的this是从外部获取的。
  • 箭头函数不能做new操作,没有this意味着它不能用作构造,所以不能用new调用它们

    var jiantou = () => {};
    var fn = new jiantou();

    这时候会报错,jiantou is not a constructor

  • 箭头函数没有arguments对象,但是同this一样,他可以访问外围函数的arguments对象
  • 箭头函数没有原型和super,它没有原型,也就不能通过super来访问原型的属性,不过同之前的this、arguments一样,这些值由外围最近一层的非箭头函数决定

    var jiantou = () => {};
    console.log(jiantou.prototype); //undefined

最后

还是那句话,你可以暂时不使用这种方法来写代码,但是你不能不会用,因为你不会知道什么时候会突然要求你用这种方法去进行业务操作。

相关文章
|
8天前
|
存储 JavaScript 索引
JS中数组的相关方法介绍
JS中数组的相关方法介绍
|
10天前
|
JavaScript 前端开发 容器
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
14 0
|
11天前
|
JSON JavaScript 前端开发
JavaScript原生代码处理JSON的一些高频次方法合集
JavaScript原生代码处理JSON的一些高频次方法合集
|
8天前
|
JavaScript 前端开发 索引
JavaScript中与字符串相关的方法
JavaScript中与字符串相关的方法
|
1天前
|
JavaScript 前端开发 Java
js 垃圾回收机制的方法
js 垃圾回收机制的方法
|
1天前
|
JavaScript 前端开发
js数据类型有几类?一共有几种?判断数据类型的方法是什么?
js数据类型有几类?一共有几种?判断数据类型的方法是什么?
|
2天前
|
JavaScript 前端开发
js绑定事件的方法
js绑定事件的方法
18 11
|
2天前
|
缓存 JavaScript 前端开发
js的入口函数,入口函数的作用
js的入口函数,入口函数的作用
12 4
|
2天前
|
JavaScript
JS生成uuid的四种方法
JS生成uuid的四种方法
7 0
|
3天前
|
JavaScript 前端开发 iOS开发
js实用方法记录-动态加载css/js
js实用方法记录-动态加载css/js
9 0