ES6(ES6其实还是js,只不过多了多种方法)
1.js声明变量的方式
var function let const Class import 定义变量的关键字
备注:不能忽略函数的形参,函数的私有变量
var 定义变量
var 变量能够提升但是不能定义,给window添加了一个对应的属性
function
funtion 既可以提前声明,同时还定义了(定义:所谓的定义,就是给这个变量赋值了)
let
let是 es6提供的一种声明变量的方式
(1) 没有变量提升的功能,在声明之前不能使用
(2) 不能重复的声明(var 可以,但是后者会覆盖前者)
(3) 不会给window添加属性
2. 作用域
学习作用域的目的:就是为了处理变量的
var 的作用域
var 声明的变量 ,作用域分为两种全局作用域和局作用域
全局作用域
在winidow 下声明的变量后者函数外声明的变量
局部作用域
在函数内声明的变量,只能作用于函数内
3.块级作用域
带 {} 的都是块级作用域,if(){} for(){} 对象{}
var 没有块级作用域这个概念,let 和 const 有块级作用域这个概念
(1) 在块级作用域下 var 和 function 跟在window下是一样的,function 有个特殊的,在块级作用域
前只会提前声明不会定义。
(2) 在块级作用域下 let 和 const 声明的变量是私有的,外面访问不到
{let a=12}
console.log(a)
(3) for 循环下 let 声明的变量不会泄露
var list=document.querySelector("#list").querySelectorAll("li");
for (var i = 0; i < list.length; i++) {
list[i].onclick=function(){
alert(i) 3 (如果是let的话每次都是 0 1 2,此时是var)
}
}
事件是异步的,for 循环之后 i 是3并且 i 还是全局的,点击了 li 最后alert 出i ,i此时是3,所
以 i 最后都会弹出3
4.块级作用域和对象的区分
{ } 如果想表示对象不能放在首行,就是{ } 前面没有任何的东西,如果有了就是对象。没有就代表块级作用域
块级作用域
{
"name":"hexin",
"age":"10"
}
对象
({
"name":"hexin",
"age":"10"
})
5.暂时性死区
如果块级作用域内使用了 let 和 const 命令声明变量了,这个区域就会被这个变量强制绑定,凡是在声明之前
这些变量都是不可用的,使用会报错,这就是暂时性死区
var a=45;
{
console.log(a);
let a=12;
console.log(a)
}
console.log(a)
暂时性死区函数场景
function fn(a=b,b=7){
console.log(a,b)
}
fn();
使用变量 b 在定义变量 b 之前了,出现了暂时性死区
6.let a=a 和 var a=a的区别
let a=a 报错,赋值运算是从左往右,右边使用变量a,发现a没有声明,而let语法
规定,不能在没定义前使用变量,所以报错
var a=a 不报错,因为var可以变量提升,在等号赋值的时候,是从右往左,使用变量
a,此时a是undefined,赋值时就是把undefined赋值给a,所以a还是undefined。
7.函数传参默认值
(1) 写法上 有默认值的写在后面,没有默认值的写在前面
(2) 如果传对应的参数,就不要默认值了,不是先赋默认值,是直接用实参去覆盖
function fn(a,b=7){
console.log(a+b)
}
fn(4,5);