== Why is this an issue?

The value of `this` depends on which context it appears: 

* Function: The value of `this` will depend on how a function was called. The value of `this` is not always the object that has the function as an __own__ property, but the object that is used to call the function. The methods `Function.prototype.call()`, `Function.prototype.apply()`, or `Reflect.apply()` can be used to explicitly set the value of `this`. Is it also possible to create a new function with a specific value of this that doesn't change regardless of how the function is called with `Function.prototype.bind()`. In non-strict mode, `this` will always be an object and will default to `globalThis` if set to `undefined` or `null`. 

* Arrow function: The value of `this` will be the same as the enclosing context. Arrow functions will not create a new `this` binding. When invoking arrow functions using `call()`, `bind()`, or `apply()`, the `thisArg` parameter is ignored.

* Class: Class methods behave like methods in other objects: the `this` value is the object that the method was accessed on. If the method is not transferred to another object, `this` is generally an instance of the class. However, for static methods, the value of `this` is the class instead of the instance.

* Global: outside of any functions or classes (also inside blocks or arrow functions defined in the global scope), the value of `this` depends on what execution context the script runs in. 

When a function is called without an explicit object context, the `this` keyword refers to the global object. This also applies when it is used outside of an object or function. The global `this` object refers to the global context in which the JavaScript code is executed. This can cause problems when the code is executed in different contexts, such as in a browser or in a Node.js environment, where the global object is different. Such uses could confuse maintainers as the actual value depends on the execution context, and it can be unclear what object the ``++this++`` keyword is referring to.

In JavaScript's "strict mode", using `this` in the global context will always be `undefined`.

[source,javascript,diff-id=1,diff-type=noncompliant]
----
this.foo = 1;   // Noncompliant: 'this' refers to global 'this'
console.log(this.foo); // Noncompliant: 'this' refers to global 'this'

function MyObj() { 
  this.foo = 1; // Compliant 
} 

MyObj.func1 = function() { 
  if (this.foo === 1) { // Compliant
    // ... 
  } 
} 
----

Instead, simply drop the ``++this++``, or replace it with ``++globalThis++``. The `globalThis` global property gives access to the global object regardless of the current environment.

[source,javascript,diff-id=1,diff-type=compliant]
----
foo = 1;               
console.log(foo);

function MyObj() { 
  this.foo = 1;  
} 

MyObj.func1 = function() { 
  if (this.foo === 1) {
    // ... 
  } 
} 
----

== Resources

=== Documentation

* MDN web docs - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this#global_context[this]
* MDN web docs - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#no_this_substitution[No this substitution]
* MDN web docs - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis[globalThis]
* MDN web docs - https://developer.mozilla.org/en-US/docs/Glossary/Global_object[Global object]
* MDN web docs - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode[Strict mode]
* MDN web docs - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/apply[Reflect.apply()]
* MDN web docs - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call[Function.prototype.call()]
* MDN web docs - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply[Function.prototype.apply()]
* MDN web docs - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind[Function.prototype.bind()]


ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Remove the use of "this".


'''
== Comments And Links
(visible only on this page)

=== on 1 Jun 2015, 08:59:46 Linda Martin wrote:
\[~ann.campbell.2] assigned for completion. Thanks!



=== on 1 Jun 2015, 17:49:08 Ann Campbell wrote:
\[~linda.martin] I've tried to expand the code sample to be more demonstrative. Please correct me if I did it wrong.

=== on 2 Jun 2015, 15:55:23 Linda Martin wrote:
\[~ann.campbell.2] Indeed it does not work, JavaScript is tricky:

----
MyObj.func1 = function() {
  if (this.foo == 1) {  // Noncompliant; addresses window.foo => actually it does not it addresses MyObj.foo variable.
    // ...
  }
}
----

Re-assigned to you: I'll let you update the code snippet in case you have precise ideas about what to put.

Thank you !

endif::env-github,rspecator-view[]
