前言 :ES6新增了若干语法,例如:let 关键字、const 声明常量、解构赋值、箭头函数、剩余参数等;以及ES6的内置对象扩展,包括 Array 的扩展方法、String 的扩展方法还有Set 数据结构等,今天这里只记录一下Let 关键字和箭头函数的经典面试题,想要了解更多请至码云金小壮查看详细笔记。
1. let关键字经典面试题
先说一下let关键字,let关键字是ES6中新增的用于声明变量的,有以下特点:
- 使用let关键字声明的变量具有块级作用域,在一个大括号中使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的,可以有效防止循环变量变成全局变量。
- 使用let关键字声明的变量没有变量提升,也就是说必须先声明再使用。
- 使用let关键字声明的变量具有暂时性死区特性,所以外部全局变量影响不了块级区的let声明的变量。
看以下代码
- var声明变量
var arr = [];
for (var i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i);
}
}
arr[0](); //2
arr[1](); //2
上面代码可以看出两次调用函数输出的结果都是一致的为 2 ,执行结构图如下:
这段代码的关键点在于变量 i 是全局变量,所以函数执行时输出的都是全局作用域下的值。
- let 声明变量
let arr = [];
for (let i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i);
}
}
arr[0](); //0
arr[1](); //1
用 let 关键字声明的变量,输出的结果为 0 1,执行结构图如下:
这次的关键点在于每次循环都会产生一个块级作用域,每个块级作用域中的变量都是不同的,函数执行时输出的是自己上一级(循环产生的块级作用域)作用域下的 i 值。
2. 箭头函数面试题
- 箭头函数不绑定this关键字,如果在箭头函数中使用this,this关键字将指向箭头函数定义位置中的this。
- 箭头函数的优点在于解决了this执行环境所造成的一些问题。比如:解决了匿名函数this指向的问题(匿名函数的执行环境具有全局性),包括setTimeout和setInterval中使用this所造成的问题。
看下面代码
var obj = {
age: 20,
say: () => {
alert(this.age)
}
}
obj.say(); //弹出undefined
上面 this.age 弹出的结果是 undefined,箭头函数this指向的是被声明的作用域里面,而对象没有作用域的,所以箭头函数虽然在对象中被定义,但是this指向的是全局作用域。
- 在全局作用域下定义 age,则输出的结果便全局作用域下 age 的赋值结果。
var age = 18;
var obj = {
age: 20,
say: () => {
alert(this.age)
}
}
obj.say(); //弹出18
重点:箭头函数this指向定义它的地方。