Dear folks, Closure Compiler gives this warnings in Advanced Mode, underlining {this.
JSC_USED_GLOBAL_THIS: dangerous use of the global this object at line 200 character 33
hovers[i4].onfocus = function() {this.className += "Hovered";}
JSC_USED_GLOBAL_THIS: dangerous use of the global this object at line 201 character 32
hovers[i4].onblur = function() {this.className = this.className.replace(/Hove...
JSC_USED_GLOBAL_THIS: dangerous use of the global this object at line 201 character 49
hovers[i4].onblur = function() {this.className = this.className.replace(/Hove...
JSC_USED_GLOBAL_THIS: dangerous use of the global this object at line 218 character 38
buttons[i5].onmouseover = function() {this.className += "Hovered";}
Q1. Whats so dangerous about this?
Q2. Should I change this?
Q3. How do I improve/solve this code?
merci!
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");
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With