大家好碾褂,我是IT修真院成都分院第三期的學(xué)員兽间,一枚正直純潔善良的web程序員
今天給大家分享一下,修真院官網(wǎng)js任務(wù)4正塌,深度思考中的知識點(diǎn)——如何理解Js作用域和作用域鏈
1.背景介紹
作用域與作用域鏈?zhǔn)荍S中非常重要的概念之一
學(xué)習(xí)作用域與作用域鏈對于深入了解JS的運(yùn)行機(jī)制有很大的幫助嘀略。
2.知識剖析
a.變量作用域
全局作用域
全局變量擁有全局作用域
局部作用域
局部變量只有在定義他的函數(shù)體內(nèi)有定義,他的作用域是局部性的乓诽,函數(shù)的參數(shù)也是局部變量 在函數(shù)體內(nèi)屎鳍,局部變量的優(yōu)先級高于全局變量,同名的局部變量和全局變量问裕,在函數(shù)體內(nèi)逮壁,全局變量會被局部變量覆蓋掉
ps.在函數(shù)體內(nèi)不使用var聲明變量,js會自動把這個(gè)變量識別為全局變量
b.函數(shù)作用域
區(qū)別于c語言及一些其他語言粮宛,js是沒有塊級作用域的窥淆,取而代之的是js自己的函數(shù)作用域 變量在聲明他們的函數(shù)體內(nèi),及這個(gè)函數(shù)體嵌套的任意函數(shù)體內(nèi)都是有定義的巍杈。
c.作用域鏈
如果將一個(gè)局部變量看作是自定義實(shí)現(xiàn)的對象的屬性的話忧饭,那么我們可以換一個(gè)角度來理解變量作用域。每一段js代碼都有一個(gè)與之關(guān)聯(lián)的作用域鏈筷畦,這個(gè)作用域鏈可以看作是一個(gè)對象列表或者是一個(gè)鏈表词裤,其中定義了這段代碼作用域內(nèi)的變量。
3.常見問題
如何理解作用域和作用域鏈
4.解決方案
// 全局變量和局部變量
var a = 0;
function test () {
var a = 1;
return a;
}
test(); //1
//嵌套函數(shù)和作用域
var c = 0;
function test () {
var helloC = 1;
function inTest () {
var heyC = 2;
//這里可以獲取到目前為止所有的變量
console.log(c); //0
console.log(helloC); //1
console.log(heyC); //2
}
inTest();
console.log(c); //0
console.log(helloC); //1
console.log(heyC); //這里會報(bào)一個(gè) heyC is defined 的錯(cuò)誤,在這個(gè)位置鳖宾,heyC這個(gè)變量是不存在的
}
test();
console.log(c);
//這里也是不能讀取到 helloC 和 heyC 這兩個(gè)變量的
// 作用域鏈
var a = 10;
function test () {
var b = 10+a;
//test: 這里需要有個(gè)a 嗨 window 你知道一個(gè)b么
// window : a啊 我有啊 給你
function inTest () {
var c = b+10;
//inTest: 這里需要有個(gè)b 嗨 test 你知道一個(gè)b么
// test : b啊 我有啊 給你
return c;
}
var d = 10 + e;
//test:hey window 我這里需要一個(gè) e 你有么
//window:我沒有啊
//test:那你再去看看你上面的好么
//window:對不起 我就是最上層了 我給你報(bào)個(gè)錯(cuò)好了~
// test: 好吧
return inTest();
}
test();
5.擴(kuò)展思考
聲明提升
//聲明提升
function test () {
console.log(a);
var a = 1;
}
test(); //undefined
//等同于
function test () {
var a ;//s先將需要的變量聲明
console.log(a);
a = 1; //在原來這里賦值
}
閉包
閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù)吼砂,創(chuàng)建閉包最簡單的方式就是在一個(gè)函數(shù)內(nèi)創(chuàng)建另一個(gè)函數(shù)。
// 閉包
function test() {
var a = 2;
function inner() {
console.log( a );
}
return inner;
}
var outter = test();
outter(); // 2
6.參考文獻(xiàn)
javaScript高級程序設(shè)計(jì)
你不知道的JS
今天的分享就到這里啦鼎文,歡迎大家點(diǎn)贊渔肩、轉(zhuǎn)發(fā)、留言拇惋、拍磚~
下期預(yù)告:如何進(jìn)行微信JSSDK開發(fā)周偎,不見不散~
技能樹.IT修真院
“我們相信人人都可以成為一個(gè)工程師,現(xiàn)在開始撑帖,找個(gè)師兄蓉坎,帶你入門,掌控自己學(xué)習(xí)的節(jié)奏胡嘿,學(xué)習(xí)的路上不再迷抿劝”。
這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學(xué)習(xí)路線伺通,學(xué)習(xí)透明化箍土,成長可見化,師兄1對1免費(fèi)指導(dǎo)罐监∥庠澹快來與我一起學(xué)習(xí)吧 !
或者你可以直接點(diǎn)擊此鏈接:邀請碼鏈接