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

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

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

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動開發(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),移動開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

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

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

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式