作用域
作用域簡單的理解就是:變量和函數(shù)可以訪問到的范圍纯命。
作用域的范圍分為兩種:
- 全局作用域
- 局部作用域
全局作用域
全局作用域意指在代碼塊中任何地方都可以訪問到的對象穴店,那么這個對象就是全局作用域排拷;
最外層函數(shù)之外聲明的變量就是全局作用域的變量。
如下代碼:
var a = 1;
function fn(){
console.log(a); //1
var b = 3;
function xx(){
var c = 3;
console.log(a); //1
}
xx();
console.log(c); //報錯 c is not defined馏谨。
}
fn()
未使用var 聲明的變量也擁有全局作用域;
function tt(){
cc = "haha";
function qq(){
b = "hello";
var non = 123123123;
console.log(cc); //haha
}
qq()
console.log(b) //hello
}
tt()
局部作用域
變量只在函數(shù)內(nèi)部存在,外部無法訪問巍虫。
function zxc(){
var a = 1;
}
zxc()
console.log(a) //a is not defined
作用域鏈
作用域鏈實質(zhì)就是作用域之間搭建的一個橋梁。
但是鳍刷,作用域鏈必須要記住的就是占遥,外層作用域中的變量和函數(shù)可以被內(nèi)層作用域所使用,但是內(nèi)層作用域中的變量和函數(shù)外層是沒有辦法來直接訪問的输瓜。
舉個栗子:
var a = 1
function fn1(){
function fn3(){
function fn2(){
console.log(b)
}
var b = 5
fn2()
}
var a = 2
//console.log(b) //b is not defined
return fn3
}
var fn = fn1()
fn()
以上例子中瓦胎,fn2如果找不到變量b,那么就會在他的外層fn3中去找變量b尤揣。
但是如果在fn3的外層找b是沒有辦法找到的搔啊,他只會往他的外層找,找到了就輸出北戏,找不到就報錯负芋。答案很顯然找不到。
函數(shù)在執(zhí)行的過程中嗜愈,先從自己內(nèi)部找變量旧蛾,如果找不到,再從創(chuàng)建當(dāng)前函數(shù)所在的作用域去找, 以此往上蠕嫁。