作用域和閉包
1.什么是作用域
一套設(shè)計(jì)良好的規(guī)則逮诲,用來(lái)存儲(chǔ)變量金抡,并且可以方便地找到這些變量橘霎,這套規(guī)則被稱為作用域
作用域嵌套:
當(dāng)一個(gè)塊或者函數(shù)嵌套在另一個(gè)塊或者函數(shù)中虑凛,就發(fā)生了作用域的嵌套碑宴;
在當(dāng)前作用域中無(wú)法找到某個(gè)變量時(shí),引擎會(huì)在外層嵌套的作用域中繼續(xù)查找桑谍,直到找到該變量延柠,或者抵達(dá)最外層作用域(即全局作用域)為止;
2.詞法作用域
詞法作用域就是定義在詞法階段的作用域锣披。換句話說(shuō)捕仔,詞法作用域是在寫代碼時(shí)將變量或者塊作用域?qū)懺谀睦餂Q定的,因此當(dāng)詞法分析器處理代碼時(shí)會(huì)保持作用域不變盈罐。
作用域查找會(huì)再找到第一個(gè)匹配的標(biāo)識(shí)符時(shí)停止榜跌;
eval(...)和with可以欺騙詞法作用域
3.函數(shù)作用域和塊作用域
屬于這個(gè)函數(shù)的全部變量都可以在整個(gè)函數(shù)的范圍內(nèi)使用及復(fù)用。
let關(guān)鍵字可以將變量綁定到所在的任意作用域中盅粪。即let為其聲明的變量隱式地劫持了所在的塊作用域钓葫。
const可以用來(lái)創(chuàng)建塊作用域變量,但其值是固定的(常量)票顾。
4.變量提升
變量和函數(shù)聲明好像被從它們?cè)诖a中出現(xiàn)的位置被移動(dòng)到了最上面础浮,這個(gè)過程就叫作提升帆调。
我們習(xí)慣將var a = 2;看做一個(gè)聲明就,而實(shí)際上JavaScript引擎會(huì)將 var a和a = 2當(dāng)做兩個(gè)單獨(dú)的聲明豆同,第一個(gè)是編譯階段的任務(wù)番刊,第二個(gè)是執(zhí)行階段的任務(wù)。
無(wú)論作用域中的聲明出現(xiàn)在什么地方影锈,都將在代碼本身被執(zhí)行前首先進(jìn)行處理芹务,可以想象成所有的聲明(變量和函數(shù))都會(huì)被“移動(dòng)”到各自作用域的最頂端,這個(gè)過程被稱為提升鸭廷。
聲明本身會(huì)被提升枣抱,而包括函數(shù)表達(dá)式的賦值在內(nèi)的賦值操作并不會(huì)提升。
5.作用域閉包
當(dāng)函數(shù)可以記住并訪問所在詞法作用域辆床,就產(chǎn)生了閉包佳晶,即使函數(shù)是在當(dāng)前詞法作用域之外執(zhí)行。
函數(shù)對(duì)象可以通過作用域鏈相互關(guān)聯(lián)起來(lái)讼载,函數(shù)體內(nèi)部的變量都可以保存在函數(shù)作用域內(nèi)轿秧,這種特性被稱為“閉包“ --《JavaScript權(quán)威指南》
function foo(){
var a = 2;
function bar(){
console.log(a);
}
return bar;
}
var baz = foo();
baz(); //2 這就是閉包的效果
this和對(duì)象原型
1.關(guān)于this
this實(shí)際上是在函數(shù)被調(diào)用時(shí)發(fā)生的綁定,它指向什么完全取決于函數(shù)在哪里被調(diào)用
2.this全面解析
3.對(duì)象
4.混合對(duì)象類
5.原型
6.行為委托
持續(xù)更新中......