兩分鐘給你講清楚JavaScript中的閉包與this

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":" 如果沒有學過其他語言就學習"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"JavaScript"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":",那麼大概率會先學習"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"作用域鏈"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":",然後覺得內層"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"函數"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"可以訪問外層"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"函數"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"中的"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"變量"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"理所當然,以至於很難接受"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"this"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"動不動就指向"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"全局"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":" 但在其他語言裏並不是這樣,"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"this"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"的操作纔是常態,"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"作用域鏈"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"才難以接受。理由見下圖紅圈中部分,內容截取自《JavaScript權威指南》"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/db/db3fbae7550f7d0a395ba5e4a08b982c.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"《權威指南》的作者把"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"作用域鏈"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"的概念放到了靠前的位置,結果導致初學編程者產生了與前人相反的困惑。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":" 其實問題並不在兩個概念出現的順序上。它們分別有各自的用途,也都很合理,只是作者沒講清楚。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"要搞明白很簡單,一個概念就能把兩個看似相對的概念聯繫起來,即: "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"函數"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"的"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"聲明"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"和"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"調用"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"是分離的,是兩回事。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":" "},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"函數"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"內"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"變量"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"和"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"函數聲明"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"時所處的環境(調用上下文)有關,即"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"作用域鏈"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"。而"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"this"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"指針適合"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"函數"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"調用時所處的環境(調用上下文)有關,但還有一個需要注意的點是: "},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"JavaScript"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"中環境即當前"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"對象"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"包含的所有"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"變量"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"。如果一個"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"函數"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"不直接屬於某個"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"對象"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"的"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"屬性"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":",那該"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"函數"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"便屬於"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"全局對象"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":",這就是"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"this"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"動不動就指向"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"全局對象"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"的原因,如果我們要在某個環境下調用"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"函數"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":",那就把該"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"函數"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"給"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}},{"type":"strong"}],"text":"對象"},{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"複製一份。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"right","origin":null},"content":[{"type":"text","marks":[{"type":"size","attrs":{"size":12}}],"text":"初學編程,如有錯誤,歡迎指正。"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章