The problem is certainly not that this is a reserved word in JavaScript.
There is no rule in the controller as syntax that says you would need to assign the value of this to a variable with the same name as the controller and I'm pertty sure angular won't do such thing either. Why would it? That would be incredibly stupid use of Function constructor and just a needless bug.
There's a simple way to test that JavaScript reserved words are not the issue here. Name your controller "throw". "Parent as throw". throw is a reserved word, but does that throw errors? No. Does that work? Yes.
this is, however, reserved in the context of angular's own template expressions. It's used to refer to the current scope of the expression.
<div ng-controller="Parent as this">
{{log(this)}}
</div>
angular.module('testApp', []).controller('Parent', function($scope){
this.test = 'foo';
$scope.log = function(arg){
console.log(arg);
};
});
The above won't throw errors, but it won't log the controller either. Instead, it will log a scope object containing the log function and $parent and what not.
In fact, it will also contain something intresting to us: property this: Object, our controller.
And sure enough, change the template expression to {{log(this.this)}} and it will log the controller instance just fine. Still wouldn't use 'this' as the name though, it would probably just cause more bugs by mistake than undefined functions ever have.
thisis a reserved word.vmapproach to incur some degree of change-cost when ports occur. For instance, if I took a genericCalendarViewmodelthat is used for all projects, I would have to go through all references ofthisand turn it intovm; just for that controller. That's the oversimplified example, and its just one of many. A lot more to be said here.