Oh, it will be. The context (global scope/window) is taken all the way to the last function… if the first function was called from window/global scope.

function a() { alert(window === this); b();  }
function b() { alert(window === this); }
a();

This will output true twice in a row: even inside b() this === window, even though b() was called from a(); It’s a chaining effect.

The alternative to this would be to instantiate b as a constructor. Just add to the above example following lines:

var c = new b();
c();

Now a call to c() returns false. (Even though it’s still calling b())

Think of c as b “version 2”. (its own instance.)

That’s because we instantiated it with new keyword.

When that happens a function owns its this context now. Even if it was called from window scope. So it’s not merely what context it was called from, but also how it was created.

Issues. Every webdev has them. Published author of CSS Visual Dictionary https://amzn.to/2JMWQP3 few others…