看代码输出结果并小结
var a = 12
var a = 15
console.log(a) //=> 15
let a = 12
let a = 13
console.log(a)
//=> Uncaught SyntaxError: Identifier 'a' has already been declared
小结: 在相同的作用域中(或执行上下文中),var允许重复声明,而let不允许重复声明
/*=>浏览器开辟栈内存供代码自上而下执行之前,不仅有变量提升,还有很多其他操作
=>"词法解析"或"词法检测":检测当前即将要执行的代码是否会出现"语法错误"SyntaxError
=>如果出现错误,代码将不会再执行(第一行都不会执行)
*/
console.log(1) //=>出现语法错误,不会执行任何一行代码
let a = 12
console.log(a)
let a = 13 //=>Uncaught SyntaxError: Identifier 'a' has already been declared
console.log(a)
console.log(1) //=>1
console.log(a)
let a = 13 //=>Uncaught ReferenceError: Cannot access 'a' before initialization
小结: 代码在执行之前,会进行词法解析,变量提升等操作。如果出现语法错误,代码将一行都不会执行
console.log(a)
var a = 12
let a = 13 //=>Uncaught SyntaxError: Identifier 'a' has already been declared
console.log(a)
/*=>所谓重复是:不管之前通过什么办法,只要当前栈内存中存在了这个变量
=>我们使用let/const重复再声明这个变量就是语法错误
*/
console.log(a)
let a = 13
var a = 12 //=>Uncaught SyntaxError: Identifier 'a' has already been declared
console.log(a)
fn() //=> 5
function fn(){console.log(1);}
fn() //=> 5
function fn(){console.log(2);}
fn() //=> 5
var fn=function(){console.log(3);}
fn() //=> 3
function fn(){console.log(4);}
fn() //=> 3
function fn(){console.log(5);}
fn() //=> 3
小结: function存在变量提升,function可以重复声明