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)/*
Special case of variable lift
Variable lift occurs on the left side of the equal sign
vara=function(){}//此处,浏览器变量提升时,只识别var,不识别function
No matter if the condition is satisfied, if the code in the variable should be carried out to enhance the
In the function, although return the following code is not executed, but to be variable lift
functionfn(){
console.log(ss);// undefinedreturn;//中断后边代码执行var ss =34;//此处的ss仍然要变量提升。永远是undefined}fn()
Anonymous function without variable lift
(function(){})()
and let var differences:
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; 作用域与变量提升