js作用域和提升
一.聲明
1.變量聲明
| var | 聲明了未賦值為undefined | 可以重復(fù)聲明 | 可以重復(fù)賦值 |
| let | 聲明了未賦值為undefined | 不可以重復(fù)聲明 | 可以重復(fù)賦值 |
| const | 聲明了就得賦值 | 不可以重復(fù)聲明 | 不可以重復(fù)賦值 |
2.函數(shù)聲明
| 聲明式:function fun(){}; |
| 函數(shù)表達(dá)式:var/let/const fun = function(){};相當(dāng)于一個(gè)變量 |
3.同名的情況
let、const參與的聲明不存在同名問題。
(1)變量和變量同名:var和var;var和函數(shù)表達(dá)式;函數(shù)表達(dá)式和函數(shù)表達(dá)式。
(2)函數(shù)與函數(shù)同名:聲明式函數(shù)和聲明式函數(shù)。
(3)變量和函數(shù)同名:var和聲明式函數(shù);聲明式函數(shù)和函數(shù)表達(dá)式。
二. 作用域
作用域:變量和函數(shù)可以訪問的范圍。
全局作用域:無論是函數(shù)外還是函數(shù)內(nèi)都能訪問到。
局部作用域:只能在函數(shù)內(nèi)訪問,在函數(shù)外不能訪問。
(1)全局變量:
在函數(shù)外使用var聲明的變量;
無論是函數(shù)內(nèi)外都沒有使用var聲明就直接賦值的變量。a=1
(2)局部變量:在函數(shù)內(nèi)使用var聲明的變量。
(1)全局函數(shù):在函數(shù)外聲明的函數(shù)。
(3)局部函數(shù):在函數(shù)內(nèi)聲明的函數(shù)。
3. 作用域鏈:就是作用域之間的相互嵌套,在查找變量的時(shí)候,會(huì)先到當(dāng)前作用域下查找,如果在當(dāng)前作用域沒有變量聲明,就會(huì)一直往上一級(jí)作用域查找。
三.提升
提升:在真正執(zhí)行js代碼之前,還有一個(gè)操作叫做預(yù)解析,預(yù)解析操作會(huì)找到文件中所有的聲明,并且使用合適的作用域?qū)⑺鼈冴P(guān)聯(lián)起來,變量和函數(shù)的聲明會(huì)被提升到與其對(duì)應(yīng)作用域的最頂端。
變量創(chuàng)建的過程:
var a = 1;
(1)聲明及初始化賦值階段(聲明階段):var a = undefined;
(2)真實(shí)賦值階段(賦值賦值):a = 1。
1. 變量的提升
(1)使用var聲明的變量只能提升聲明階段,賦值階段還停留在原地。
(2)隱式聲明的變量不會(huì)提升。a=1;
2. 函數(shù)的提升
(1)使用聲明式函數(shù)創(chuàng)建的函數(shù),聲明及賦值階段全都會(huì)被提升。
(2)使用函數(shù)表達(dá)式創(chuàng)建的函數(shù)只提升聲明階段,賦值階段還停留在原地。
(3)當(dāng)函數(shù)被聲明在判斷語句內(nèi)部時(shí),JS會(huì)將函數(shù)聲明當(dāng)成表達(dá)式(賦值聲明),即不會(huì)提升
3. 變量和函數(shù)的同名提升情況
(1)變量和變量同名:var和var;var和函數(shù)表達(dá)式;函數(shù)表達(dá)式和函數(shù)表達(dá)式。會(huì)按順序提升,結(jié)果取決于最后面的值。
(2)函數(shù)與函數(shù)同名:聲明式函數(shù)和聲明式函數(shù)。會(huì)按順序提升,結(jié)果取決于最后面的值。
| var a = 1; var a = function(){}; console.log(a) | var a; var a; a = 1; a = function(){}; console.log(a); |
(3)變量和函數(shù)同名:var和聲明式函數(shù);聲明式函數(shù)和函數(shù)表達(dá)式。會(huì)按順序提升,結(jié)果取決于變量是否有值,變量有值就取變量值,變量沒值就取函數(shù)值。
| var a=1; function a(){}; console.log(a); | var a; function a(){}; a=1; console.log(a) |
| 全局作用域 | 局部作用域 | 提升 | |
| 隱式聲明的變量a=1; | 函數(shù)內(nèi)、外 | 無 | 無 |
| var | 函數(shù)外 | 函數(shù)內(nèi) | 提升聲明部分 |
| let | 無 | {} | 無 |
| const | 無 | {} | 無 |
| 函數(shù) | 函數(shù)外 | 函數(shù)內(nèi) | 聲明式函數(shù)是整體提升;函數(shù)表達(dá)式提升聲明部分 |
作用域貫穿整個(gè)步驟
第一步:找聲明(是否符合聲明規(guī)則,聲明種類:var/聲明式函數(shù)/函數(shù)表達(dá)式)
第二步:找提升(對(duì)應(yīng)的提升規(guī)則,同名問題)
| var a = 1; function b(){ ????a = 10; ????return; ????function a(){ ????????console.log(a); ????} } b(); console.log(a); | |
| fn(30); var fn = 10; function fn(fn){ ?????console.log(fn); ?????var fn = 20; ?????console.log(fn); ?????function fn(){ ????? console.log(fn); ?????} } console.log(fn); | function fn(fn) { // var fn=30; function fn() { console.log(fn); } var fn; console.log(fn);//1function fn = 20; console.log(fn);//2 20 } var fn; fn(30); fn = 10; console.log(fn);//10 |
總結(jié)
- 上一篇: R1_LiceCap动态图片GIF录制软
- 下一篇: 思科设备ACL与NAT技术