OK, zugegeben - die richtige Frage müsste eigentlich lauten:
Warum macht die Funktion json_encode() dies nicht gleich selber?
Weil es ein Bug ist?
(Denn wenn sie ungültigen JS-Code erzeugt, ist sie als fehlerhaft zu betrachten.)
Dabei ist http://www.json.org/ doch eigentlich sehr aussagekräftig, was das Escaping angeht.