在 JavaScript 中,利用實例方法作為事件處理程序的回調提出了範圍挑戰。 this 變數可以從表示物件實例轉換為觸發回呼的元素。為了解決這個問題,開發人員通常採用以下方法:
function MyObject() { this.doSomething = function() { ... } var self = this; $('#foobar').bind('click', function() { self.doSomething(); // this.doSomething() would not work here }) }
雖然它起作用,但可能會引起對其可讀性和效率的擔憂。有一種利用閉包概念的更優雅的解決方案。
閉包允許嵌入式函數存取在其父作用域中定義的變量,從而有效地「通道」它們。例如,考慮以下範例:
var abc = 1; // we want to use this variable in embedded functions function xyz() { console.log(abc); // it is available here! function qwe() { console.log(abc); // it is available here too! } ... }
但是,此技術對於this 變數無效,因為它可以動態變更範圍:
// we want to use "this" variable in embedded functions function xyz() { // "this" is different here! console.log(this); // not what we wanted! function qwe() { // "this" is different here too! console.log(this); // not what we wanted! } ... }
解決方案涉及為此分配一個別名,在嵌入式函數中保留其值。
var abc = this; // we want to use this variable in embedded functions function xyz() { // "this" is different here! --- but we don't care! console.log(abc); // now it is the right object! function qwe() { // "this" is different here too! --- but we don't care! console.log(abc); // it is the right object here too! } ... }
採用此技術可確保事件處理程序內的適當範圍和清晰度,提供更強大和可維護的方法。
以上是如何確保 JavaScript 中事件處理程序中實例方法的正確作用域?的詳細內容。更多資訊請關注PHP中文網其他相關文章!