1.var :体现在变量和函数表达式方面:
1)会发生预解析,函数的优先级高于变量,故而,函数可以提前调用。
2)声明的变量会被后面同一作用域中的同名变量所覆盖掉.
3)属于函数体作用域
//实例一:
console.log(a);
a();
var a=1;
function a(){
console.log("helllo");
};
console.log(a);
a();
/*上述代码的解析过程是:
var a;
function a(){...};
console.log(a)//结果是function a(){...};
a()//结果是hello
a=1;
console.log(a);//1
a();//会报错,此时a不再是一个函数
//实例二
var m="hello";
function f(n){
console.log(n);
function n(){};
console.log(n);
var n="world";
console.log(n);
};
f(m);
/*上述函数的预解析过程是:
var m;
function f(){...};
f(m);
//下面设计f(m)函数中的预解析过程
var n;
n="hello"//函数作用域内会优先使用形参进行赋值
function n(){...};
console.log(n);//结果是function n(){...}
console.log(n);//结果同上
n="world";
console.log(n);//world;
*/
2.let 该关键字用于声明变量
属于块级作用域的范畴
不存在变量提升
同一个作用域内,不能重复声明
实例一:
console.log(a);
let a="hello";
//结果是:
//Uncaught ReferenceError: a is not define
//---------------
var a="hello";
let a="world";
//会报错:Identifier 'c' has already been declared
//--------------------
let a="hello";
var a="world";
//会报错:Identifier 'c' has already been declared
实例二:
for(var i=0;i<3;i++){
setTimeout(function(){console.log(i)},1000);
}
console.log(i);
//结果 3,
//因为这里声明的i相当于一个全局变量,会经历var i=0;var i=1;var i=2;var i=3;最终的i结果是3
for(let i=0;i<3;i++){
setTimeout(function(){console.log(i);},1000);
}
console.log(i);//该变量i未声明,i is not defined
//结果是
/*
i is not defined
0
1
2
*/
/*
在for循环中let i每一次循环都会重新声明变量,且每次声明的变量都只会在当前的这个块级作用域内起作用
*/
3.const:用于声明一个常量或者是地址不变的值,声明时需要同时赋值。
同一个作用域内,不能重复声明
实例一:
var a=1;
const a=2;
//报错:Identifier 'a' has already been declared
//------------------------------------------------
const m=1;
var m="oo";
//报错Identifier 'm' has already been declared
实例二:
const obj={};
obj.name="tom";
obj.skill="eat";
console.log(obj);
// {name: "tom", skill: "eat"}