let
用let声明的变量,没有变量提升###
let a = "zhar";
console.log(a);//输出结果是 zhar
但如果是
console.log(a);//输出结果是 a is not defined
let a = "zhar";
//这个说明, let 声明的变量,跟 var 声明的变量不同,let 声明的变量没有变量提升
let声明的变量是块级作用域,是局部变量
var arr = [];
for(let i=0;i<5;i++){
arr[i] = function(){
console.log(i);
}
}
arr[4](); //输出的结果是4,如果arr[3]();输出的结果就是3;
对比以下代码看看:
var arr = [];
for(var i=0;i<5;i++){
arr[i] = function(){
console.log(i);
}
}
arr[4]();//输出结果是5 不管arr的下标如何改变,结果都是5;
var 和 let 的区别
var b = 10;
var b = 20;
console.log(b);//结果是20;
let b = 10;
let b = 20;
console.log(b);//结果就是b is declard( b 已经被声明过了);
再来一个例子 var 定义的是全局变量
d = 10;
var d ;
console.log("d=",d);//输出结果是10;
如果换成let let 定义的是区域变量.所以用了let 不会担心变量名称的重复使用
d = 10;
let d ;
console.log("d=",d); //输出结果是 d is not defined
var e = 100;
function fun(){
let e;
e=200;
console.log(e);
}
fun();//暂时性死区
// 使用 let 声明的变量 不受外部的同名变量的影响 输出结果是200
//如果let e;放在e=200;的后面,就会报错,e is not defined
Const
const是声明常量的 const是constant单词的简写
var PI = 3.14;//常用大写单词表示这是一个常量;
//ES6 新增了常量的写法
const PI2 = 3.14;//正确写法
//PI2 = 2.15; 不可更改,这样写会报错,常量 是不可变的,
const p ;// 一旦声明需立即赋值,不可更改,其他与let一致.不赋值也会报错
const 声明基本数据类型, (数字, 字符串, 布尔, null, undefined) 之后不能修改/
如果声明引用数据类型,(主要是数组和对象) , 指向的存放数据的指针, 是可以修改的.
变量指向数据的内存地址,保存的只是一个指针,const只能保证这个指针是不变的,至于它指向的数据结构就不可控制了。
=>箭头函数
箭头函数不会导致作用域的更改
保留当前的作用域,实用箭头函数声明的函数,
其作用域为 声明时所在的位置(作用域)
箭头函数的好处: 作用域已经指向了外层,不再像ES5的函数,函数内部的是一个局部函数,变量\作用域指向的是内部函数的作用域的对象,使用箭头函数以后,不仅语法更加简洁,而且,this指向了外部的环境
箭头函数不能使用 new 操作符
箭头函数 不能使用 arguments
//是一种新的声明函数的方式
function fun(){
return 100;
}
console.log(fun()); //以前的写法
let foo = () => 10;
console.log(foo());//箭头函数的写法
let bar = (a,b)=> a*b;
console.log(bar(11,12));//也可以传参数
let aa = (a,b)=>{
return a+6+b;
}
console.log(aa(12,11)); //可以return
//回调函数
function b(callback){
callback();
}
b(function(){
console.log(1111);
})
b(()=>{console.log(222)});
b(()=>console.log(33));//可以传回调函数
let obj = {
name:"zhar",
say : function(){
console.log(this.name);
setTimeout(()=> console.log(this.name),0)
}
}
obj.say();