2015-08-25 3 views
-1

Так возьмите следующий простой яваскрипта класс фрагмент кода:Каковы решения для избежания «того»?

var Class = function() { 
    this.publicvar = 1; 

    this.privileged = function() { 
     return this.publicvar; 
    }; 
}; 
var c = new Class(); 
setTimeout(c.privileged, 1);     //c.this -> window 

Очевидно, что это не будет работать, «это» будет объект окна. Таким образом, на этом этапе мы можем сделать var, который = this, и использовать this.publicvar, ИЛИ, мы можем это сделать.

setTimeout(function() { c.privileged() }, 1); //c.this -> Class 

Какое большое решение и легко исправить, я теперь не надо ставить «что» повсюду в моем классе. Не говоря уже о том, что использование «этого» становится намного сложнее при использовании объекта object.prototype.publicMethod.

Итак, мой вопрос: какие другие случаи, когда вам нужно будет беспокоиться о том, что «это» в «this.publicvar» привязано к контексту окна и каково решение для каждого? (Я надеюсь, что у нас есть решение для каждого из них, так что я никогда не должны использовать это :)

ответ

1

Использование Function «s bind:

setTimeout(c.privileged.bind(c), 1); 

Или вы можете предварительно bind в конструкторе , но это может быть довольно неожиданным в JS, тогда как оно является значением по умолчанию в Python:

var Class = function() { 
    this.publicvar = 1; 

    this.privileged = (function() { 
     return this.publicvar; 
    }).bind(this); 
}; 
var c = new Class(); 
setTimeout(c.privileged, 1); 
Смежные вопросы