做用域是指程序源代碼中定義變量的區域。它規定了程序執行時對該變量的訪問權限。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運行時沒有什麼關係啊,彆着急,後續還會在接着聊。對象