变量:
一. let:
- let(块级变量声明)的特点:
- 没有变量声明提升,不能重复定义,不挂载到window
- 声明的变量和 {} 配合产生块级作用域 --- 生命在大括号内部的变量无法在外部使用
- 产生临时死区
- 解决闭包问题
a. 不存在变量提升:
例:
console.log(a) // ReferenceError
let a = 10
b. 同一个作用域下不能重复定义同一个名称
例:
let a =100
let a =200
console.log(a) // ReferenceError
let a =100
a =200
console.log(a) // 200 可以这样写
特别提醒 : 同一个作用域下,不同的作用域是可以声明同一个名称的
c. 严格的作用域-块级作用域
例:
1.
function fun (){
var n =10
if(true){
var n = 100
}
console.log(n)
}
fun() // 100
2.
{
let a =10
}
console.log(a) // 报错
3.
{
var a =10
}
console.log(a) // 10 这就可以
4.
let a = 10
{
console.log(a) // 10
}
// 块级作用域并不是完全封闭,里面的还是可以用外面的变量
d. 临时性死区
例:
1.
let a = 10
{
console.log(a) //报错
let a = 20
}
//如果在块级作用域内有用let声明的变量,那么只会找该作用域内的变量
2.
let a = 10
{
console.log(a) // 10
// 块级作用域并不是完全封闭,里面的还是可以用外面的变量
}
e. 解决了闭包
例:
1.
var arr = []
for (var i = 0; i < 10; i++) {
arr[i] = function () {
console.log(i)
}
}
arr[0]() // 10
arr[4]() // 10
arr[7]() // 10
2.
var arr = []
for (let i = 0; i < 10; i++) {
arr[i] = function () {
console.log(i)
}
}
arr[0]() // 0
arr[4]() // 4
arr[7]() // 7
二. const:
- const的特点:
- 一经声明,常量的值就不可改变
- 只声明,不赋值,也报错
- let的特点const也都有
a. const声明是一个只读常量,一经声明,常量的值就不可改变
例:
const PI = 3.1415;
PI = 3; //报错
b. 只声明 不赋值 也报错
例:
const foo; //报错
c. const实质:
- const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动
- 对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量
- 但对于复合类型的数据(主要是对象和数组),变量指向的内存地址
例:
const foo = {};
foo.prop = 123; // 这样是可以的
foo = {} // 但你又重新开一个内存地址,这就不行了
//所以若定义引用类型时是地址不能改变
d. let有的性质,const也都有
箭头函数
- 箭头函数的特点:
- 不用function关键字
- 只能作为函数使用而不能用new,没有原型
- 参数不能重复命名
- 返回值可以不写return,但有时要配合 {}
- 内部arguments this 由定义时外围最接近一层的非箭头函数决定
- 写法
例:
1.
var f = v => v
//变量名 =参数 => 函数体
2.
var f= function(n1,n2){
return n1 + n2
}
相当于
var f = (n1,n2) => n1+n2
3.
var f= function(n1,n2){
fun(n1 , n2)
}
相当于
var f = (n1,n2) => {fun(n1 , n2)}
小知识点:
-
在es6中对象里想写一个属性,并且属性为函数,特殊写法
let obj={ fn:function(){} //可以换成下面这种写法 fn(){} }