太拘泥于“this”的字面意思就會(huì)產(chǎn)生一些誤解。有兩種常見的對(duì)于this 的解釋,但是它們都是錯(cuò)誤的。

介紹之前先解釋下什么是動(dòng)態(tài)作用域

簡(jiǎn)要地分析一下動(dòng)態(tài)作用域,重申它與詞法作用域的區(qū)別。但實(shí)際上動(dòng)態(tài)作用域是JavaScript 另一個(gè)重要機(jī)制this 的表親。詞法作用域是一套關(guān)于引擎如何尋找變量以及會(huì)在何處找到變量的規(guī)則。詞法作用域最重要的特征是它的定義過程發(fā)生在代碼的書寫階段(假設(shè)你沒有使用eval() 或with)。動(dòng)態(tài)作用域似乎暗示有很好的理由讓作用域作為一個(gè)在運(yùn)行時(shí)就被動(dòng)態(tài)確定的形式,而不是在寫代碼時(shí)進(jìn)行靜態(tài)確定的形式,事實(shí)上也是這樣的。通過示例代碼來說明:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

function foo() {
console.log( a ); // 2}function bar() {var a = 3;
foo();
}var a = 2;
bar();

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

詞法作用域讓foo() 中的a 通過RHS(js中賦值的一種形式) 引用到了全局作用域中的a,因此會(huì)輸出2。而動(dòng)態(tài)作用域并不關(guān)心函數(shù)和作用域是如何聲明以及在何處聲明的,只關(guān)心它們從何處調(diào)用。換句話說,作用域鏈?zhǔn)腔谡{(diào)用棧的,而不是代碼中的作用域嵌套。因此,如果JavaScript 具有動(dòng)態(tài)作用域,理論上,下面代碼中的foo() 在執(zhí)行時(shí)將會(huì)輸出3。

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

網(wǎng)友評(píng)論