ES6-----声明变量
以前定义变量
var a="7";
之前作用域: 全局或者函数内;
1 var a="9"; 2 function fn(){ 3 console.log(a) 4 var a="5" 5 } 6 fn()
这个结果是undefined
以为函数内有一个变量也为a,则局部变量起作用,有可能有的人会说,var a="5"在console.log(a)下面啊,还没有初始化局部变量a啊,但是var生明变量有提升的作用,上面的代码等同于
var a="9"; function fn(){ var a; console.log(a) a="5" } fn();
声明会提前,所以结果才是undefined;
现在ES6 声明变量 let,const;
(1) let 声明变量
let a=5
具有块级作用域
{
这里面声明的变量只在这里有效
}
例子:
if(true){ var a="5"; let b="6"; } console.log(a);//结果为5 console.log(b);//报错b未定义
块级作用域有:
if(){}
for(){}
while(){}
let a="9"; function fn(){ console.log(a) let a="5" } fn()
这个结果是报错,原因是,如果块级内有变量的定义,则一定会有块级中的那个变量,但是let没有提升功能,所以是报错,而不是undefined
如果块级内没有这个变量,就以外面父辈的块级中定义的为主;
{ let i=0; let i="1"; }
同一个块中重复定义一个变量会报错
for(let i=0;i<3;i++){ let i='abc'; console.log(i) }
结果是三次 'abc' 原因是for循环这样写,()里面的也会形成一个块,{}也会形成一个块,并且()块是{}的父块,所以不会出现重复定义变量的报错,并且结果是子块中的值
var arr=[] for( var i=0;i<10;i++){ arr[i]=function(){ console.log(i) } } arr[5]() 结果是 9 var arr=[] for( let i=0;i<10;i++){ arr[i]=function(){ console.log(i) } } arr[5]() 结果是 5 结果是
2:const;
const和let一样,只是const定义的变量不能修改;
const不能先定义后赋值
const a;
a=9
这样会报错。
但是注意了
const arr=["apple","balala"]; arr.push("orange"); 这样不会报错,对象也是一样 如果你想要const声明的对象和数组不能被修改 Object.freeze(arr);
var arr=Object.freeze(["aa',"bb"])
arr.push("cc") 这样会报错 这样就不能被修改了