这是我参与更文挑战的第24天,活动详情查看: 更文挑战
全局作用域
在编程语言中,不论Java还是JavaScript,变量一般都会分为全局变量和局部变量两种。在 JavaScript 中,全局变量是挂载在 window 对象下的变量,所以在网页中的任何位置你都可以使用并且访问到这个全局变量。下面通过看一段代码来说明一下什么是全局的作用域。
var global = "global"
function getVar(){
console.log(global)
var local = "local"
console.log(local)
}
getVar();
console.log(local) //
console.log(global) //global
function setVar(){
sVar = 'setVar'
}
setVar();
console.log(sVar)//setVar
console.log(window.sVar)//setVar
可以看到global这个变量不论在哪都能被访问到,他就是全局变量。而在函数getVar中声明的局部变量local只能在函数getVar中访问到,在函数外访问就是空。下面的setVar函数中的sVar虽然是在函数中,但是没有var这些声明的关键字,直接被赋值的也是全局变量,也可以在外部被访问到。
全局变量实际上都是挂载在window上,也就是说window.全局变量一样可以访问到。全局变量也有个问题,可能会变量命名冲突。
函数作用域
在JavaScript中,函数中定义的变量叫做函数变量,这个时候只能在函数内部才能访问到它,所以它的作用域也就是函数的内部,称为函数作用域。
function getVar(){
var local = "local"
console.log(local)
}
getVar();//local
console.log(local) //
可以看到local是在函数getVar中定义的,local就是一个局部变量,它的作用域就是在getVar中,这个作用域也叫函数作用域。
这意味着除了在这个函数内部你无法访问到这个局部变量,当这个函数执行完之后,局部变量也会被响应销毁,所以你再getVar函数外访问local是没用的。
块级作用域
ES6新增了块级作用域,最直接的体现就是let关键词,用let关键词定义的变量只能在块级作用域中被访问,这个变量在被定义之前是不能被使用的。
举个例子,在JS编码过程中if语句以及for语句后面{...}
里面所包括的就是块级作用域。
console.log(a)
if(true){
let a = 'a'
console.log(a)//a
}
console.log(a)//a is not defined
可以看到在if的代码块中打印a是可以的,但是在if代码块之外就提示a is not defined了。