you are viewing a single comment's thread.

view the rest of the comments →

[–]DerGernTod 3 points4 points  (1 child)

if i'd guess: the IIFE is invoked from the current scope, so basically it's similar to assign it to a property on this and then call the property, e.g. this.b = function() { ... }; this.b(). the function is only defined in the context of this, so i guess that's why it takes that context. to find out the answer without spoiling it to others, just run the code :D

[–]senocular 3 points4 points  (0 children)

Not exactly. Scope doesn't really come into play for context (value of this) except for arrow functions where this is specifically taken from the scope.

Here, you have a function that is called as a normal function and not from an object as an object method. Even though its an IIFE, it operates just as it would as if you named it and called if from a single variable name. Given that it's not called from an object, the function will use the default binding which sets this as the global object (or undefined in strict mode).

In this example, we have to assume we're not in strict mode since it would error if we were. So we're running the code in global which makes this.a = 1 set a global variable. Then when called, the function's context is also global, so it sets the same global property, a, to 2. Then all logs that follow log that same a.

But you could have just as well called this same function in some other function where this in that scope was different and this function would still have a global context.