做用域是指程序源代码中定义变量的区域。它规定了程序执行时对该变量的访问权限。javascript
前面咱们聊了什么是做用域,那javascript中做用域都有哪些特色呢?接下来咱们就聊聊这个java
在讨论这个问题以前先看一段以下代码:bash
var a = 1
function f1 () {
console.log(a)
}
function f2 () {
var a = 2
f1()
}
f2()
复制代码
上述代码会打印1。这就很好的说明了,在javascript中,其做用域是静态做用域也就是词法做用域。通俗点来说,函数的做用域在定义的时候就已经定了。套用做用域的概念就是函数f1在定义的时候,就规定了访问的变量a是全局变量中的a,所以当在函数f2中执行的时候,函数f1没有访问函数f2中的局部变量a的权限。函数
var scope = 'global'
function checkscope () {
var scope = 'local'
let i = 10
{
let i = 8
console.log(i) // => 8
}
return scope
}
checkscope() // => 'local'
复制代码
在以下代码中咱们定义了变量a,b,c,他们都在同一个做用域内。ui
function test (d) {
console.log(a) // => undefined
console.log(b) // => undefined
console.log(c) // => undefined
var a = 1
if (d > 0) {
var b = 2
for (var c = 0; c < 10; c ++) {
console.log(c) // =>0 - 9
}
console.log(c) // =>10
}
console.log(b) // =>2
}
test(1)
复制代码
咱们发现javascript函数做用域在整个函数体内始终可见,即使是在判断语句和循环语句中也没有收到影响。这意味着变量在声明前就已经可用。javascript的这个特性就称为声明提早也叫变量提高。spa
到底全局做用域跟局部做用域什么关系呢?还有你们可能会疑惑,咱们再聊javascript静态做用域的时候函数f1是怎样访问到全局变量a的呢?code
今天咱们聊了一聊javascript中的做用域,可能你们已经发现啦我说了半天做用域好像跟javascript运行时没有什么关系啊,别着急,后续还会在接着聊。对象