太拘泥于“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í)上也是這樣的。通過示例代碼來說明:
function foo() { console.log( a ); // 2}function bar() {var a = 3; foo(); }var a = 2; bar();
詞法作用域讓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。
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式