var s =12;functionfn(){}
console.log(window.s)
console.log(window.fn)let a =12;
console.log(window.a)// undefined`var跟function可以重复创建同一个变量名(let不可以)
var a =12;var a =13;
console.log(a)// 13let a =12;// 报错 SyntaxError(语法错误)let a =13;`
var和function有变量提升(let没有)
b =12// 等价于window.b = 12因为window.可以省略var b =12(有变量提升)var a,b,c =12;//undefined undefined 12//创建变量a,b,c,但是只给c赋值var a =12,b =13, c =14;// 创建三个变量,给每一个变量都进行赋值var a = b = c =12;// 等价于 var a = 12; b = 12; c = 12;
var a =12;functionfn(a){
console.log(a)//13}fn(13)var name ='erYa';functionfn(name){functionname(){}
name =7;
console.log(name)}fn(name)let y =12;functionfn(){functiony(){}
y =100;
console.log(y)// 100}fn();
console.log(y)// 12var num =12;functionfn(){var num =0
num++}fn();
console.log(num)
console.log(a)// undefindvar a =12;// a =12
console.log(a)// 12/* console.log(num);
var num = 100;
console.log(num); */
console.log(window.a);// undefined
console.log(b);// 报错 引用错误 在当前代码之后的代码不在运行var a =10;
b =12;/*
console.log(b; // 报错 语法错误,他会使整个页面不运行
*/
console.log(a);// undefined
console.log(b);// 引用错误var a = b = c =100;
console.log(a);// undefined
console.log(b);// undefined
console.log(c);// undefinedvar a,b,c =100;
console.log(a);// undefined
console.log(b);// undefined
console.log(c);// 100functionfn(){
console.log(num);var num =12;}fn();
console.log(num)/*
变量提升
var name
fn (){}
*/var name ='jinYu';functionfn(name){/*
name // f
*/
console.log(name);//ffunctionname(){}
console.log(name);// f}fn(name)/*
functionfn(){
console.log(ss);// undefinedreturn;//中断后边代码执行var ss =34;//此处的ss仍然要变量提升。永远是undefined}fn()
匿名函数不进行变量提升
(function(){})()
let和var区别:
1.let和const不存在变量提升机制,var和function有变量提升
创建变量六种方式中:var和function有变量提升,而let,const,class,import不存在这个机制
2.var允许重复声明,而let不允许
在相同作用域中或执行上下文中,使用var和function声明变量并且重复声明,是不会有影响的(声明第一次后,在遇到就不再重复声明)
但是let和const不行,浏览器会校验当前作用域中是否存在这个变量,已存在,则再次基于let等重新声明就会报错
3.let能解决typeof检测出现的暂时性死区问题(let比var更严谨)
console.log(a);//报错 a is not defined
console.log(typeof a);//undefined 本该报错 ,bug浏览器死区
解决方法;
console.log(typeof a);
let a; 作用域与变量提升