Unless set elsewhere, the value of self
is window
because JavaScript lets you access any property x
of window
as simply x
, instead of window.x
. Therefore, self
is really window.self
, which is different to this
.
window.self === window; // true
If you’re using a function that is executed in the global scope and is not in strict mode, this
defaults to window
, and therefore
function foo() { console.log( window.self === window, // is self window? window.self === this, // is self this? this === window // is this window? ); } foo(); // true true true
If you’re using a function in a different context, this
will refer to that context, but self
will still be window
.
// invoke foo with context {} foo.call({}); // true false false
You can find window.self
defined in the W3C 2006 working draft for the Window Object here.