大家好~ ?我是一枚正直純潔的苦逼程序員I凰省!@茉伞M首印!
1.背景介紹
什么是作用域呢迄委,簡(jiǎn)單的說褐筛,作用域就是變量與函數(shù)的可訪問范圍,即作用域控制著變量與函數(shù)的可見性和生命周期叙身。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種硫狞。
2.知識(shí)剖析
1.全局作用域(Global Scope) 在代碼中任何地方都能訪問到的對(duì)象擁有全局作用域信轿,一般來說一下幾種情形擁有全局作用域:
(1)在函數(shù)外面定義的變量擁有全局作用域,例如:
var a ="全局變量";
function tion(){
console.log(a);
}
tion();
(2)所有末定義直接賦值的變量自動(dòng)聲明為擁有全局作用域残吩,例如:
function tion(){
var a="變量";
b="全局變量";
console.log(a);
}
tion();//變量
console.log(b);//全局變量
console.log(a);//腳本錯(cuò)誤
變量b擁有全局作用域财忽,而a在函數(shù)外部無法訪問到。
(3)所有window對(duì)象的屬性擁有全局作用域
一般情況下泣侮,window對(duì)象的內(nèi)置屬性都都擁有全局作用域即彪,例如window.name、window.top等等活尊。
var a ='baidu.com';
function text(){
console.log(this.a);
}
text();// 'baidu.com'
window.text();// 'baidu.com'
console.log(window.a);// 'baidu.com'
在上面示例中隶校,a變量和text()函數(shù)方法沒有指定上級(jí)對(duì)象,所在二者會(huì)被添加到window全局對(duì)象蛹锰,所以直接訪問二者與通過window訪問本質(zhì)相同(如深胳,直接訪問text()與使用window.text()訪問一樣)。
3.常見問題
如何更加直觀的體現(xiàn)作用域鏈
4.解決方案
5.編碼實(shí)戰(zhàn)
? ? ? ? ? ? ? ? ? dome
6.擴(kuò)展思考
如何運(yùn)用作用域鏈的知識(shí)進(jìn)行性能優(yōu)化
其實(shí)作用域鏈就是JS引擎查詢數(shù)據(jù)的一個(gè)鏈表铜犬,后定義的覆蓋先定義的舞终,查詢不到定義的數(shù)據(jù)就往深一層查詢,一直到全局作用域?yàn)橹?但是越往內(nèi)層延伸癣猾,讀寫速度就會(huì)越慢敛劝,查找全局變量是最慢的。所以纷宇,在編寫代碼的時(shí)候應(yīng)盡量少使用全局變量夸盟,盡可能使用局部變量。 如果一個(gè)跨作用域的對(duì)象被引用了一次以上呐粘,則先把它存儲(chǔ)到局部變量里再使用满俗。例如下面的代碼:?
function changeColor(){
document.getElementById("a").onclick=function(){
document.getElementById("b").style.backgroundColor="red";
document.getElementById("a").style.backgroundColor="red"; };
}
這個(gè)函數(shù)引用了兩次全局變量document转捕,查找該變量必須遍歷整個(gè)作用域鏈,直到最后在全局對(duì)象中才能找到唆垃。這段代碼可以重寫如下:?
function changeColor(){
var a=document.getElementById("a");
var b=document.getElementById("b")
a.onclick=function(){
a.style.backgroundColor="red";
b.style.backgroundColor="red";
}; } 這段代碼比較簡(jiǎn)單五芝,但是如果程序中有大量的全局變量被從新反復(fù)訪問,那么重寫后的代碼性能會(huì)有顯著改善辕万。
7.參考文獻(xiàn)
參考:?JavaScript 開發(fā)進(jìn)階:理解 JavaScript 作用域和作用域鏈
8.更多討論
三個(gè)問題
1.
意思是作用域鏈就是JS引擎查詢數(shù)據(jù)的一個(gè)鏈表枢步,后定義的覆蓋先定義的,查詢不到定義的數(shù)據(jù)就往深一層查詢渐尿,一直到全局作用域?yàn)橹?但是越往內(nèi)層延伸醉途,讀寫速度就會(huì)越慢,查找全局變量是最慢的砖茸。所以隘擎,在編寫代碼的時(shí)候應(yīng)盡量少使用全局變量,盡可能使用局部變量凉夯。 如果一個(gè)跨作用域的對(duì)象被引用了一次以上货葬,則先把它存儲(chǔ)到局部變量里再使用。
2.
回答 局部變量劲够,因?yàn)椴樵兊臅r(shí)候一一級(jí)一級(jí)的從局部到全局震桶。
3.
閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該表達(dá)式的一部分征绎。