项目开发中一些常用的es6知识,主要是为以后分享小程序开发、node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫。

项目开发常用es6介绍

  • 1、块级作用域 let const

  • 2、箭头函数及this指向

  • 3、promise、

  • 4、async await语法
  • 4、模块化 module export和import

  • 5、解构赋值、字符串模板

  • ……

箭头函数

顾名思义 用箭头 “ => ” 定义函数

//es5的函数
var fn = function(num) {
return num;
}
//用箭头函数就可以这样写
var fn = num => num
//没有参数可以这么写
var fn = () => 1
//参数多的时候可以这样写
var fn = (num, num1, num2) => num

如果箭头函数的代码块部分有多条语句,就要使用大括号将它们括起来,并且使用return返回。

var func = (a, b) = > {
...
//此处省略多行
return b;
}

由于花括号{ }被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上花括号,否则会报错。

var func = (a, b) => {
name: a,
age: b
} //报错 var func = (a, b) => {
{
name: a,
age: b
}
} //不报错

所以由上述示例可以看出箭头函数的一个作用是简化代码。

箭头函数还有一个更主要的作用:解决this的指向问题

this指向

先说一下普通函数中的this,普通函数中的this表示调用此函数时的对象。而箭头函数是没有自己的this的,箭头函数里面的this会继承自外部的this。或者用代码块的概念解释会更加直观:箭头函数中的this就是外层代码块的this。举一个例子:

var x = 11;
var obj = {
x: 22,
methods: {
x: 33,
say: function() {
console.log(this.x)
},
say2: () => {
console.log(this.x)
}
}
}
obj.methods.say();//33 普通函数this表示调用次函数时的对象即methods对象
obj.methods.say2();//11 say2中this所在的外层代码块(向外数一个花括号)是methods对象 但并不是说this就是该对象,而是指methods对象中的this 此时this是window

再看一个例子:

var btn = document.getElementById('btn');
btn.onclick = function() {
setTimeout(function() {
console.log(this) //普通函数中的this指的是window
}, 100)
setTimeout(() => {
console.log(this) //箭头函数中的this在定义的时候就已经绑定了,即继承自this当前所在代码块的外层代码块中的this
//而外层代码块是一个普通函数this自然就指向调用该函数时的对象(id为btn的button按钮)
}, 100)
}

尾调用优化

首先来说一下什么是尾调用:尾调用指某个函数的最后一步是调用另一个函数。

请小心这里有一个深坑“最后一步”,举几个例子:

function f(x) {
let y = g(x);
return y
}//不是尾调用,因为最后一步返回了y,不是调用函数 function f(x) {
return g(x) + 1
}//不是尾调用,因为最后一步是加一,不是调用函数 function f(x) {
g(x)
}//不是尾调用,因为函数的最后一步是一个默认的return undefined; function f(x) {
return g(x)
}//是尾调用

很多同学会疑问,为什么要做尾调用优化呢?这是一个事关内存优化的功能。

函数调用会在内存形成一个“调用记录”,又称“调用帧”。每形成一个调用帧就会占用一定的内存,假如有一个函数A里面调用了函数B,函数B里面又调用了函数C,以此类推。

在不是尾调用的情况下,因为js是单线程同步的,所以只有当函数B执行完毕才会执行函数A的return语句(函数没写return会有一个默认的return undefiend;),此时函数B的调用帧才会消失。但事实上,只有当函数B执行到return语句时才会执行完毕,而在函数B执行return之前会先调用函数C,所以当这种函数调用越来越多的时候,形成的调用帧也会越来越多占用的内存就会越来越大。俗话说精满自溢,内存也会有溢出的时候是吧,这就不行了!所以要用尾调用!

尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用帧,只要直接用内层函数的调用帧,取代外层函数的调用帧就可以了。

比如在执行递归的时候就可以利用尾调用达到优化内存的目的。函数调用自身,称为递归。如果尾调用自身,就称为尾递归。

递归非常耗费内存,因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”。但对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。

//递归 计算n的阶乘,最多需要保存n个调用记录,复杂度 O(n)
function factorial(n) {
if (n === 1) return 1;
return n * factorial(n - 1)
}
factorial(5) //120 //改成尾递归,只保留一个调用记录,复杂度 O(1)
function factorial(n, total) {
if (n === 1) return total;
return factorial(n - 1, n * total)
}
factorial(5, 1) //120

前端项目中常用es6知识总结 -- 箭头函数及this指向、尾调用优化的更多相关文章

  1. 前端项目中常用es6知识总结 -- let、const及数据类型延伸

    项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const  2 ...

  2. 前端项目中常用es6知识总结 -- Async、Await让异步美如画

    项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...

  3. 前端项目中常用es6知识总结 -- Promise逃脱回调地狱

    项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...

  4. ES6——>let,箭头函数,this指向小记

    let let允许你声明一个作用域被限制在块级中的变量.语句或者表达式. 还是那个经典的问题:创建5个li,点击不同的li能够打印出当前li的序号. 如果在for循环中使用**var**来声明变量i的 ...

  5. ES6学习笔记 -- 尾调用优化

    什么是尾调用? 尾调用(Tail Call)是函数式编程的一个重要概念,就是指某个函数的最后一步是调用另一个函数. function f(x) { return g(x) } 如上,函数 f 的最后一 ...

  6. ES6系列之项目中常用的新特性

    ES6系列之项目中常用的新特性 ES6常用特性 平时项目开发中灵活运用ES6+语法可以让开发者减少很多开发时间,提高工作效率.ES6版本提供了很多新的特性,接下来我列举项目中常用的ES6+的特性: l ...

  7. 在Vue&Element前端项目中,对于字典列表的显示处理

    在很多项目开发中,我们为了使用方便,一般都会封装一些自定义组件来简化界面的显示处理,例如参照字典的下拉列表显示,是我们项目中经常用到的功能之一,本篇随笔介绍在Vue&Element前端项目中如 ...

  8. Android 项目中常用到的第三方组件

    项目中常用到的第三方组件 1 社会化分享ShareSDK-Core-2.5.9.jarShareSDK-QQ-2.5.9.jarShareSDK-QZone-2.5.9.jarShareSDK-Sin ...

  9. 项目中常用js方法整理common.js

    抽空把项目中常用js方法整理成了common.js,都是网上搜集而来的,大家一起分享吧. var h = {}; h.get = function (url, data, ok, error) { $ ...

随机推荐

  1. 关于TCP/IP,必知必会的十个经典问题[转]

    关于TCP/IP,必知必会的十个问题 原创 2018-01-25 Ruheng 技术特工队   本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. 一 ...

  2. day14_DBUtils学习笔记

    一.DBUtils介绍 Apache公司开发的框架. 什么是dbutils?它的作用?   DBUtils是java编程中的数据库操作实用工具,小巧简单实用.   DBUtils封装了对JDBC的操作 ...

  3. CSS3 :nth-child() 选择器---挖坑

    E:nth-child(n) 语法: E:nth-child(n) { sRules } 说明: 匹配父元素的第n个子元素E,假设该子元素不是E,则选择符无效.(也就是说,会检查从body开始的每个元 ...

  4. node.js 使用forever守护进程

    //forever的安装:npm install forever -g//使用forever启动守护进程:forever start 路径/your_app.js//关闭守护进程:forever st ...

  5. 使用nginx搭建https服务器

    http://www.cnblogs.com/tintin1926/archive/2012/07/12/2587311.html 最近在研究nginx,整好遇到一个需求就是希望服务器与客户端之间传输 ...

  6. CentOS6.5 安装Python2.7后, yum出现“No module named yum”错误

    安装如下方法安装python2.7: yum install –y python27 python27-devel python-docutils cd /usr/bin/ rm -rf python ...

  7. python获取日期加减之后的日期

    python语言中的datetime模块可以利用其中的方法获取不同的日期,比如获取当前日期.明天.昨天.上个月.下个月和明年.下面利用几个实例说明这些日期的获取方法,操作如下:     第一步,利用d ...

  8. bzoj 3759 Hungergame 博弈论+线性基

    和nim游戏类似 易证必败状态为:当前打开的箱子中石子异或和为0,没打开的箱子中不存在一个子集满足异或和为0 因为先手无论是取石子还是开箱子,后手都可以通过取石子来使状态变回原状态 所以只需判定是否有 ...

  9. HTTP 和 WebSocket的区别

    有关http和WebSocket 的区别网上有很多的质料. 个人在此仅仅是记录以下自己的学习心得,自己的理解. 1. http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要 ...

  10. Python练习:哥德巴赫猜想

    哥德巴赫猜想 哥德巴赫 1742 年给欧拉的信中哥德巴赫提出了以下猜想:任一大于 2 的偶数都可写成两个质数之和.但是哥德巴赫自己无法证明它,于是就写信请教赫赫有名的大数学家欧拉帮忙证明,但是一直到死 ...