コードからみてわかる通り、calldataはfunctionの引数を格納するための領域です。contextの切り替え(call, delegatecallを呼び出し時に切り替わります)が行われる時に再設定されますが、contextが切り替わらない間は値は保持されます。
calldata領域が使われるのは、transactionをトリガーとしてfunctionがcallされた時か、call, delegatecallで別のcontractを呼び出した時だけです。同じContract内の他のfunctionを呼び出す時はstack領域を使って引数は渡されます。