1.let
1.1.let生命的变量旨在所处于的块级有效
举个例子:
if(true){
let a = 10
console.log(a) //10
}
console.log(a) // a is not defined
1.2.不存在变量提升
举个例子:
console.log(a) // a is not defined
let a = 10
1.3.暂时性死区
-- 利用let声明的变量会绑定在这个块级作用域,不会受到外界影响
var num = 10
if(true){
console.log(num) num is note defined
let num = 30
}
2.const
声明常量,常量就是值(内存地址)不能变化的量
1.具有块级作用域
2.声明常量时必须赋值
const PI = 3.14
3.常量赋值后,值不能修改
const PI = 3.14
PI = 5 //会报错
const arr = [1,2]
arr[0] = 3
arr[1] = 4
console.log(arr) [3,4]
arr = [6,7] //报错,(直接修改为新数组会报错)
-- const声明的变量是一个常量
-- 既然是常量不能重新赋值
基本数据类型,不能重新赋值
复杂数据类型,不能更改地址
-- 声明const必须给值
3.let const var 的区别
var | let | const |
---|---|---|
函数级作用域 | 块级作用域 | 块级作用域 |
变量提升 | 不存在变量提升 | 不存在变量提升 |
值可改变 | 值可改变 | 值不可改变 |
const使用建议:存储的数据不需要变化
1.函数的定义
2.PI
3.数学一定恒定不变的值
4.解构赋值
– 从数组中提取值,按照对应位置,对变量赋值,对象也可以实现解构。
4.1.数组解构
let [A,B,C] = [1,2,3]
console.log(A,B,C) // 1,2,3
如果解构不成功,变量的值为undefined
4.2.对象解构
let person = {name = 'Daiwang',age:17 }
let {name,age} = person
console.log(name,age) // Daiwang 17
-- 还可以重命名 let {name:myName,age:myAge} = person
console.log(myName,myAge) //Daiwang 17
-- 利用解构赋值能够更方便的去取对象中的属性跟方法
5.箭头函数
() => {}
const fn = () =>{}
1.函数体只有一句代码,且代码的执行结果就是返回值,额可以省略大括号
const sum = (num1,num2) => num1+num2
2.如果形参只有一个,可以省略小括号
const fn = n => n
箭头函数不绑定this关键字,箭头函数中的this,指向的是函数定义位置的上下文this
const obj = {name :'Daiwang'}
function fm() {
console.log(this) obj对象
return () =>{ obj对象
console.log(this) 指向箭头函数定义的位置,那么这个箭头函数定义在fn里,而fn指向obj对象,所以这个this指向obj对象
}
}
const resFn = fn.call(obj
resFn()
注意:
··箭头函数中不绑定this,箭头函数中的this指向的是它所定义的位置,箭头函数的作用域指向谁,它就指向谁。
··箭头函数的优点在于解决了this执行环境所造成的一些问题,比如:解决了匿名this指向的问题(匿名函数的执行环境是具有局限性的,包括setTimeOut和setInterval中使用this所造成的问题。
面试题
var age = 100
var obj = {
age:20
say()=>{
alert(this.age)
}
}
obj.say() //100
对象没有作用域,所以箭头函数虽然在对象中被定义,但是this指向全局作用域。