Javascript this

HTML

<input id="button" type="button" value="button"/>
<br/><br/>
<div id="outputBox" />

JavaScript

outputBox = document.getElementById("outputBox");

function print(printMe = "") {
	outputBox.innerHTML += printMe;
}

function printLine(printMe = "") {
	outputBox.innerHTML += printMe + "<br/>";
}

var someVar = "someVar";

function func(who) {
	printLine("Outer func (" + who + "): " + this);
  var self = this;
  (function() {
  	printLine("Inner func (" + who + "): " + this);
    printLine("Inner func (" + who + ") self: " + self);
  })();
}
func("global");
printLine();
func.call(someVar, "someVar");

printLine();

function funcTwo(who) {
	printLine("Outer funcTwo (" + who + "): " + this);
  var self = this;
  return function funcThree() {
  	printLine("Inner funcThree (" + who + "): " + this);
    printLine("Inner funcThree (" + who + ") self: " + self);
  };
}
funcTwo("global")();
printLine();
f = funcTwo("global f");
f();
printLine();
funcTwo.call(someVar, "someVar")();

printLine();

object = {
  func: function(who) {
    printLine("Object outer (" + who + "): " + this);
    var self = this;
    (function() {
      printLine("Object inner (" + who + "): " + this);
      printLine("Object inner (" + who + ") self: " + self);
    })();
  }
}
object.func("good");
printLine();
bad = object.func;
bad("bad");

printLine();

function funcClass(who) {
	printLine("funcClass (" + who + "): " + this);
}
funcClass.prototype.func = function() {
	printLine("funcClass.prototype.func: " + this);
  self = this;
  (function() {
    printLine("classClass.func inner: " + this);
    printLine("classClass.func inner self: " + self);
  })();
}
fc = funcClass("bad");
printLine();
fc = new funcClass("good");
fc.func("good");

printLine();

class classClass {
	constructor() {
  	printLine("classClass constructor: " + this);
  }
  func() {
  	printLine("classClass.func: " + this);
    self = this;
    (function() {
    	printLine("classClass.func inner: " + this);
      printLine("classClass.func inner self: " + self);
    })();
  }
  funcTwo() {
  	this.func();
  }
}
cc = new...