let
用let聲明的變量,沒有變量提升###
let a = "zhar";
console.log(a);//輸出結(jié)果是 zhar
但如果是
console.log(a);//輸出結(jié)果是 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](); //輸出的結(jié)果是4,如果arr[3]();輸出的結(jié)果就是3;
對比以下代碼看看:
var arr = [];
for(var i=0;i<5;i++){
arr[i] = function(){
console.log(i);
}
}
arr[4]();//輸出結(jié)果是5 不管arr的下標(biāo)如何改變,結(jié)果都是5;
var 和 let 的區(qū)別
var b = 10;
var b = 20;
console.log(b);//結(jié)果是20;
let b = 10;
let b = 20;
console.log(b);//結(jié)果就是b is declard( b 已經(jīng)被聲明過了);
再來一個例子 var 定義的是全局變量
d = 10;
var d ;
console.log("d=",d);//輸出結(jié)果是10;
如果換成let let 定義的是區(qū)域變量.所以用了let 不會擔(dān)心變量名稱的重復(fù)使用
d = 10;
let d ;
console.log("d=",d); //輸出結(jié)果是 d is not defined
var e = 100;
function fun(){
let e;
e=200;
console.log(e);
}
fun();//暫時性死區(qū)
// 使用 let 聲明的變量 不受外部的同名變量的影響 輸出結(jié)果是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 聲明基本數(shù)據(jù)類型, (數(shù)字, 字符串, 布爾, null, undefined) 之后不能修改/
如果聲明引用數(shù)據(jù)類型,(主要是數(shù)組和對象) , 指向的存放數(shù)據(jù)的指針, 是可以修改的.
變量指向數(shù)據(jù)的內(nèi)存地址滓技,保存的只是一個指針,const只能保證這個指針是不變的媳友,至于它指向的數(shù)據(jù)結(jié)構(gòu)就不可控制了。
=>箭頭函數(shù)
箭頭函數(shù)不會導(dǎo)致作用域的更改
保留當(dāng)前的作用域,實用箭頭函數(shù)聲明的函數(shù),
其作用域為 聲明時所在的位置(作用域)
箭頭函數(shù)的好處: 作用域已經(jīng)指向了外層,不再像ES5的函數(shù),函數(shù)內(nèi)部的是一個局部函數(shù),變量\作用域指向的是內(nèi)部函數(shù)的作用域的對象,使用箭頭函數(shù)以后,不僅語法更加簡潔,而且,this指向了外部的環(huán)境
箭頭函數(shù)不能使用 new 操作符
箭頭函數(shù) 不能使用 arguments
//是一種新的聲明函數(shù)的方式
function fun(){
return 100;
}
console.log(fun()); //以前的寫法
let foo = () => 10;
console.log(foo());//箭頭函數(shù)的寫法
let bar = (a,b)=> a*b;
console.log(bar(11,12));//也可以傳參數(shù)
let aa = (a,b)=>{
return a+6+b;
}
console.log(aa(12,11)); //可以return
//回調(diào)函數(shù)
function b(callback){
callback();
}
b(function(){
console.log(1111);
})
b(()=>{console.log(222)});
b(()=>console.log(33));//可以傳回調(diào)函數(shù)
let obj = {
name:"zhar",
say : function(){
console.log(this.name);
setTimeout(()=> console.log(this.name),0)
}
}
obj.say();