Eu odeio perder escopo em Javascript, porém gosto que seja bastante flexível ao que deveria ser em qualquer situação. Existem algumas maneiras de não ter problemas com o escopo ao passar para as funções internas.
** Vanilla JS **
var myFoo = function() {
var parent = this, myBar;
myBar = function() {
console.debug( 'parent is', parent, 'i am', this );
}
myBar()
}
ou
var myFoo = function() {
var myBar;
myBar = (function() {
console.debug( 'i am', this );
}).bind(this);
myBar()
}
** Coffeescript **
myFoo = ->
myBar = ( ->
console.debug 'i am ', @
).bind @
myBar()
ou
myFoo = ->
myBar =>
console.debug 'i am', @
myBar()
Eu realmente gosto da solução de ligação, pois é uma maneira de definir a ligação para o escopo e permite cenários interessantes, onde você pode alterar dinamicamente a ligação em uma função anônima.
No entanto, o bind é mais lento do que o escopo léxico, então acho que, embora eu prefira .bind (this) a self = this, continuará sendo a melhor prática.
Espero que isso seja útil, eu realmente gosto do .bind (this) para usar sobre self = this. Isso economiza muitos problemas e mantém meu código claro