var let const相关

1.在ES5中,顶层对象的属性和全局变量是等价的,var 命令和 function 命令声明的全局变量,自然也是顶层对象

var a = 12;
function f(){};

console.log(window.a) // 12
console.log(window.f) // f(){}
console.log(this.a) // 12
console.log(this.f)  // f(){}

2.但ES6规定,var 命令和 function 命令声明的全局变量,依旧是顶层对象的属性,但 let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性

let a = 12;
let zs = function f(){};

console.log(window.a) //undefined
console.log(window.zs)//undefined
console.log(this.a)//undefined
console.log(this.zs)//undefined

3.var 存在变量提升,允许在没有声明变量之前使用变量,即将变量声明悄悄提升到使用变量之前

console.log(zs) // undefined
var zs = 'zs'
console.log(zs)  // 'zs'

变量提升只局限于当前的函数,不会提升到函数外面

console.log(a)

var fn = function () {
    console.log(a);
    var a=2;
    console.log(a)
};
fn() // 会直接报错

var可以重复声明一个变量只在自己的作用域和子作用域生效,可以理解为一旦在函数中使用var声明变量a,就在函数的顶部先声明了a=undefined,然后再运行到var的时候给a赋值;

重复声明变量

var zs = 2
var zs = 4
zs  // 4

函数块中声明的var变量不会影响函数之外的相同名字的的变量

console.log(a)
var a = 1;
console.log(a)
 
var fn = function () {
    console.log(a);
    a=3;
    console.log(a)
    var a=2;
    console.log(a)
 
 
};
fn()
console.log(a)
 
// undefined
// 1
// undefined
// 3
// 2
// 1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容