Предупреждение: сначала глючит код JavaScript!
// 1: buggy counter
// -----------------
// problem: 'this' can be "broken"
var Counter1 = function() {
this.count = 0;
this.increment = function() {
function increment_helper(){
++this.count; // this refers to window (global), not to the object that Counter1 was called with
}
increment_helper();
}
this.reset = function() { this.count = 0; }
this.get_count = function() { return this.count; }
}
var counter1 = new Counter1();
counter1.increment();
document.writeln("<p> 1: " + counter1.get_count() + "</p>");
Как видно, this
в increment_helper
скорее относится к глобальной области (или к области window
, если быть точным, ЕСЛИЯ правильно понял) вместо того, чтобы ссылаться на это закрывающего закрытия.Таким образом, вывод будет:
0
вместо
1
I 'Я перечислю лучшее (все еще не идеальное, но все в порядке) решение, а затем задам основной вопрос.Итак, решение (IMHO) можно отсортировать так:
// 2: better counter
// -----------------
// solved: 'that' can't be "broken"
var Counter2 = function() {
var that = this;
that.count = 0;
that.increment = function() {
function increment_helper(){
++that.count; // that refers right to the object the Counter1 was called with
}
increment_helper();
}
that.reset = function() { that.count = 0; }
that.get_count = function() { return that.count; }
}
var counter2 = new Counter2();
counter2.increment();
document.writeln("<p> 2: " + counter2.get_count() + "</p>");
Итак, главный вопрос: почему this
особенный, как никто другой в JavaScript?Почему только this
и для какой цели?
Большое спасибо!
Обновление: После @ комментария Джордана ниже (где он объяснил разницу между относительные переменные вроде this
и переменные области действия как обычные), перефразируя мои вопросы:
A: Каково общее обоснование относительных переменных?
B: почему this
является единственной относительной переменной в JavaScript?Любое обоснование того, почему относительная / ограниченная концепция может (исключительно) применяться к каждой переменной?