【深入理解ES6】函数

2023-09-17 23:42:30

箭头函数

这是 ES6 中引入的一个有趣的新特性。箭头函数,顾名思义就是一种使用箭头(=>)定义的新语法,与传统函数的差别如下:

  1. 没有this、super、arguments和new.target绑定,他们由外围最近一层非箭头函数决定。
  2. 不能通过New关键字调用。箭头函数没有 construct 方法,所以不能用作构造函数。
  3. 没有原型,所以不存在 prototype 属性。
  4. 不可以改变this绑定,函数内部的this值不可以被改变,在函数生命周期内始终保持一致。
  5. 不支持arguments对象,箭头函数没有arguments绑定,所以必须通过命名参数和不定参数两种形势访问函数的参数。
  6. 不支持重复命名参数,传统函数只有在严格模式下才不能有重复命名的参数。

箭头函数的语法:

//加法
var add = function(a,b){
    return  a+b;
}
var sum = (a,b)=>a+b;

//排序的比较器
var result = values.sort((a,b)=>a-b);

其中箭头函数的参数为 ( => )左边括号的内容,右边为返回值。

尾调用优化

尾调用优化是ES6引擎的优化。之前的循环调用中,每一个未用完的栈帧都会被保存在内存中,当调用栈变得过大时程序会出现问题,例如爆栈。

尾调用优化就是指函数作为另一个函数的最后一条语句被调用。

function doSomething(){
     return doSomethingElse();//尾调用
}

尾调用优化没有明确的语法,而是符合条件会自动优化。

在ES6中如果满足以下条件,尾调用不再创建新的栈帧,而是清楚并重要当前栈帧。(因为在ES5之前需要)

  1. 尾调用不访问当前栈的变量(函数不能是一个闭包)
  2. 在函数内部,尾调用是最后一条语句。
  3. 尾调用的结果作为函数值返回。

好处:
尾调用可以帮助函数保持一个更小的调用栈,从而减少内存的使用,避免栈溢出错误,当程序满足条件时,引擎会自动对其优化。

function factorial(n,p=1){
	if(n<=1){
		return 1*p;
	}else{
		let result = n*p;
		//优化后
		return factorial(n-1,result);
	}
}

无法优化的示例:

"use strict"
function doSomething(){
    //调用不在尾部无法优化.
    var Result = doSomethingElse();
    return Result;
}

function doSomething2(){
    var sum =1;
    fun = () =>num;

    //无法优化,闭包
    return func();
}

尾调用优化和函数的懒执行有异曲同工之妙,典型的案例就是斐波拉契数列。把时间复杂度从 N^2 下降到 N

更多推荐

【腾讯云 Cloud Studio 实战训练营】使用云IDEA,快速构建React完成点餐H5页面

文章目录前言简介优势项目介绍实战教学注册流程创建工作空间环境配置安装antd-mobile安装less和less-loader暴露webpack配置文件修改config/webpack.config.js文件安装normalize上传项目素材替换App.js主文件创建index.less文件启动项目清理实验先停止项目再

在 Windows 上直接安装 React

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录必备条件创建React应用本指南将介绍如何使用create-react-app工具链直接在Windows上安装React。如果你不熟悉React并且正好有兴趣学习,我们建议遵循以下说明。如果你要创建一个单页应用

【九章斩题录】Leetcode:判定字符是否唯一(C/C++)

精品题解🔥《九章斩题录》👈猛戳订阅面试题01.01.判定字符是否唯一✅模板:C语言classSolution{public:boolisUnique(stringastr){}};💭思考:《程序员面试金典》里的题,这题和剑指Offer的"数组中重复的数字"几乎一模一样啊,只是重复的数字变成了重复的字符,判断"重复

【python爬虫】—星巴克产品

文章目录需求爬取星巴克产品以及图片,星巴克菜单python爬虫爬取结果需求爬取星巴克产品以及图片,星巴克菜单网页分析:首先,需要分析星巴克官方网站的结构,了解菜单栏的位置、布局以及菜单项的标签或类名等信息。发送HTTP请求:使用Python的requests模块发送HTTPGET请求,获取星巴克网页的HTML内容。解析

爬虫异常处理技巧分享

在进行爬虫数据采集的过程中,我们常常会遇到网络波动和自动化验证等异常情况。这些问题可能导致爬虫运行中断或被识别为机器请求而受到限制。本文将分享一些实用的爬虫异常处理技巧,帮助您规避网络波动和自动化验证,提高数据采集的稳定性和成功率。一、处理网络波动1.设置重试机制:当爬取过程中遇到网络错误或超时,在合理的时间范围内进行

爬虫入门基础-Selenium反爬

在网络时代,爬虫作为一种强大的数据采集工具,被广泛应用于各行各业。然而,许多网站为了防止被恶意爬取数据,采取了各种反爬虫机制。为了能够成功地绕过这些机制,Selenium成为了爬虫领域的一把利器。本文将为你介绍爬虫入门基础,并重点探讨如何使用Selenium应对反爬虫的挑战。一、爬虫入门基础1、定义:爬虫是一种模拟浏览

minikube搭建k8s

环境:centos7,docker18minikube搭建k8s说明minikube是最接近原生kubernetes的本地单机版集群,支持大部分kubernetes功能,用于学习和开发k8s。支持Linux、Windows、Mac官网安装文档安装前提一台物理机或者虚拟机,物理机CPU大于2核vcpu、2G内存、20G磁

Java堆(Java Heap)

对于Java应用程序来说,Java堆(JavaHeap)是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存。在《Java虚拟机规范》中对Java堆的描述是:“所有的对象实例以及数组都应

ZMQ协议

一、ZMQ特点普通的socket是端对端的关系,ZMQ是N:M的关系,socket的连接需要显式地建立连接,销毁连接,选择协议(TCP/UDP)和错误处理,ZMQ屏蔽了这些细节,像是一个封装了的socket库,让网络编程变得更简单。ZMQ不光用于主机与主机之间的socket通信,还可以是线程和进程之间的通信。ZMQ提供

Zookeeper集群 + Kafka集群

ZookeeperZookeeper概述Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目Zookeeper工作机制Zookeeper从设计模式角度来理解:是一个,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zo

Vue路由与nodes的环境配置

一,Vue路由什么是Vue路由?Vue路由是Vue.js的一部分,是一个官方的Vue.js插件,用于管理单页面应用程序的路由。它允许您在应用程序中使用URL路径和参数来管理不同的页面视图,而无需刷新页面。使用Vue路由,您可以轻松地设置和管理客户端路由,包括嵌套和动态路由。它还提供了一些高级功能,例如路由守卫,用于在页

热文推荐