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!
Just to add example of what @marcinkuzminski added comment to @stephen Chung answer
Source : https://developers.google.com/closure/compiler/docs/js-for-compiler
If you know the type of the "this" variable, you can declare it with a JsDoc to stop the compiler from complaining:
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:
You would have known that "this" in
doSomething
refers tofoo
. However, if you use the Advanced Mode of the Closure Compiler, the compiler may "flatten" thefoo
namespace and you'll end up with:with
foo.doSomething
being "flattened" to a single global variablea
. 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:
"this" might have different meaning in different context, so it tells you exactly that. You can use closures instead:
Instead of
have: