Я полностью согласен с тем, что слишком много встроенных функций закрытия не улучшают читабельность. С другой стороны, мне категорически не нравится стиль написания замыканий var self = this
, для которого this
является лишь вариантом, поскольку он все еще слишком многословен в своем объявлении, и вы вводите свое собственное новое ключевое слово, будь то this
или self
.
То, что вы хотите, это карри / связать метод.
function $A(o)
{
var a = [];
for (var i = 0; i < o.length; ++i)
a.push(o[i]);
return a;
}
Function.prototype.bind = function()
{
var _method = this;
var a = $A(arguments)
var o = a.shift();
return function()
{
return _method.apply(o, a.concat($A(arguments)));
}
}
Function.prototype.curry = function()
{
var _method = this;
var a = $A(arguments);
return function()
{
return _method.apply(null, a.concat($A(arguments)));
}
}
Методы взяты из библиотеки Prototype . Я использую их даже в проектах, которые не используют библиотеку Prototype, поскольку они очень полезны!
В вашем случае это означает вместо записи:
var This = this;
oRequest.onreadystatechange = function() {
This.handleResponse(oRequest, sUsername)
}
Теперь вы можете написать:
oRequest.onreadystatechange = this.handleResponse.curry(oRequest,sUsername);
Однако, если вы хотите передать значение этого ключевого слова, вы можете сделать это
oRequest.onreadystatechange = this.handleResponse.bind(this,oRequest,sUsername);
handleResponse
при вызове будет иметь тот же this
контекст, что и submitHandler
.