Using this option instead of $ scope is not allowed until Angular 1.2 is released. $ scope was original, and this led to a substantial replacement, since most often they can be used interchangeably. However, they are technically different, and it looks like you would decide to use one over the other when calling a function.
From 'this' vs $ scope in AngularJS controllers :
it is - When the controller constructor function is called, it is the controller. When the function defined in the $ scope object is called, it is the "scope when the function was called." It may (or may not be!) Be the $ scope on which the function is defined. Thus, inside the function, this and $ scope may not match.
$ scope - Each controller has an associated $ scope object. The function of the controller (constructor) is responsible for setting the model properties and functions / behavior in the related field. Only methods defined on this $ scope object (and parent scope objects, if prototypical inheritance is in the game) are available from HTML / view. For example, from ng-click, filters, etc.
Clicking on the first link will show that this and $ scope are the same, since the "scope when the function was called" is the scope associated with ParentCtrl.
Clicking on the second link will show this, and $ scope does not match, since the "scope when the function was called" is the scope associated with ChildCtrl. Thus, the scope of ChildCtrl $ is set here. Inside the method, $ scope is still the scope of ParentCtrl $.
I try not to use this inside a function defined in the $ scope scope, since it confuses which $ scope affects, especially considering that ng-repeat, ng-include, ng-switch and directives can create their own child regions.