用var声明与不用var声明有两个场景
全局作用域时:
① var声明有变量提升var a = 10;不用则没有变量提升b = 5
如果顶部直接console.log(b)未声明变量会报错:未找到
//但是使用window.b则不会报错并打印undefined;
//是因为未声明直接赋值会被隐式声明为全局变量,但隐式声明的全局变量严格来说不是真正的变量,而是全局对象window的属性
//此时就算你window.一个没有声明也没有赋值的属性,它也会打印undefined,
//用一个不存在的变量会出错;但是用一个不存在的属性,会返回undefined值
当你在b = 5;后打印console.log(window.b),window的属性b会被赋值,输出5
在b = 5;后打印console.log(b),window的属性b会被赋值,输出5 //未声明直接赋值会被隐式声明为'全局变量',再赋值

如果顶部直接console.log(a);//会在全局作用域找a变量,也就是var声明的a,因变量提前,输出undefined
在var a = 10;后打印console.log(window.a)或console.log(a),都输出10

② 使用var定义的变量不可以delete删除,没有var 定义的变量可以delete删除
//未声明直接赋值会被隐式声明为全局变量
//隐式声明的全局变量严格来说不是真正的变量,而是全局对象的属性,属性可以通过delete删除,而变量不可以

 

函数作用域时:
① var声明变量有变量提升,并且是局部变量,外部无法访问

② 无var声明变量没有变量提升,会被隐式声明变为全局变量,外部可以访问
但要注意外部访问时要放在调用函数后,并不是函数一开始执行就会把它变为全局变量,必须执行到这条语句

 

注意:在ES5的'use strict'模式下,如果变量没有使用var定义,就会报错

posted on 2022-03-28 05:30  TANTT  阅读(131)  评论(0)    收藏  举报