If you know the type of the "this" variable, you can declare it with a JsDoc to stop the compiler from complaining:
hovers[i4].onfocus =
/** @this {Element} */
function() {this.className += "Hovered";}
Caveat: this, however, assumes you know for sure the type of the "this" variable. This may not be as easy as it seems. For example:
foo.doSomething = function(x) { this.bar = x; }
foo.doSomething("Hello");
You would have known that "this" in doSomething
refers to foo
. However, if you use the Advanced Mode of the Closure Compiler, the compiler may "flatten" the foo
namespace and you'll end up with:
a = function(x) { this.b = x }
a("Hello");
with foo.doSomething
being "flattened" to a single global variable a
. In this case, the "this" variable obviously points to the global object instead! Your code will break!
Therefore, the Closure Compiler is quite adamant in warning you not to use "this" in functions that can be flattened. You may use "this" in constructors and prototype functions without this warning though.
To resolve this, it is better to avoid using "this" by using the namespace itself:
foo.doSomething = function(x) { foo.bar = x; }
foo.doSomething("Hello");
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…