2011-05-23 124 views
0

我正在寫一個Mootools插件,並且無法理解範圍問題。一些代碼來傳達我的上下文:Mootools/Javascript範圍問題

var pluginName = new Class({ 
    implements: [ Options ], 

    initialize: function(paramOne, options) { 
    this.setOptions(options); 
    }, 

    someFunction: function() { 
    $$('menu').each(function(menu) { 
     // SCOPE OF INTEREST 
    }); 
    } 
}; 

我不知道是否有訪問該選項在我寫的「利益範圍」的範圍對象的方式。我知道一個辦法是在someFunction的開頭設置一個變量,像這樣:

someFunction: function() { 
    var optionIWantToAccess = this.options.relevantOption; 
    $$('menu').each(function(menu) { 
     // now optionIWantToAccess is available here 
    }); 
    } 

但這似乎有點笨拙,一個更好的選擇的氣味。這個問題的更一般的版本是:我可以在Mootools迭代器中訪問類級作用域(不確定這是否是正確的術語......但是初始化函數內部的作用域就是我所說的內容)?

任何幫助,將不勝感激。

謝謝。

回答

3

您可以將函數綁定到實例。

someFunction: function() { 
    $$('menu').each(function(menu) { 
    // 'this' is still the original instance 
    this.options.relevantOption; 
    }.bind(this)) 
} 

功能#綁定在舊版瀏覽器中不可用,但添加對它的支持是非常直接的。

+2

幾件事情。 mootools原型函數並添加'bind'(如果本地不可用)。其次,'Array.each'在回調函數後面接受第二個參數,也就是'bind',這樣你就可以做'array.each(fn(){this.something();},this);'where'this''是你綁定的範圍,但它可以是任何你需要它 - 這是最乾淨/最可讀的方式去做 – 2011-05-23 20:41:26

+0

這聽起來很方便! – 2011-05-23 20:47:52

+0

另外,請查看'Binds' mutator,這是一個更好的/更清晰的綁定範圍方式。 – 2011-05-23 21:15:31